我生成了一个带有证书信息的文本文件,并尝试将其分成两半,以便将文本的前半部分保存到密钥文件中,将另一半文件保存到证书文件中。我能够使用
more +7 cert.txt > cert.crt
将下半部分保存到新的证书文件中,但我正在努力解决如何将上半部分转换为新的密钥文件。
这是通过批量脚本完成的,该脚本远程发送到Windows机器并在Windows机器上执行,因此需要使用Windows内置的命令来完成。
示例:
-----BEGIN PRIVATE KEY-----
sample key data
sample key data
sample key data
sample key data
sample key data
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
sample cert data
sample cert data
sample cert data
sample cert data
sample cert data
-----END CERTIFICATE-----
答案 0 :(得分:2)
您可以使用findstr /N
在从文件cert.txt
读取的每一行之前,使用其行号和冒号以及for /F
循环来迭代这些扩充行。然后,您可以将每一行(删除前缀)重定向到相应的输出文件中,具体取决于当前行号:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "FULLFILE=cert.txt" & rem // (combined input file)
set "KEY_FILE=cert.key" & rem // (output key file)
set "CERTFILE=cert.crt" & rem // (output certificate file)
set "KEYLINES=7" & rem // (number of lines that belong to key file)
set "CERTLINE=" & rem // (first line of text belonging to cert. file)
if not defined KEYLINES set /A "KEYLINES=(1<<31)-1"
for /F "delims=" %%L in ('
findstr /N /R "^" "%FULLFILE%" ^& ^
^> "%KEY_FILE%" break ^& ^
^> "%CERTFILE%" break
') do (
set "LINE=%%L"
set /A "LNUM=LINE"
setlocal EnableDelayedExpansion
if defined CERTLINE (
if "!LINE:*:=!"=="!CERTLINE!" (
endlocal
set /A "KEYLINES=0"
setlocal EnableDelayedExpansion
)
)
if !LNUM! LEQ !KEYLINES! (
>> "!KEY_FILE!" echo(!LINE:*:=!
) else (
>> "!CERTFILE!" echo(!LINE:*:=!
)
endlocal
)
endlocal
exit /B
您可以通过两种方式配置此脚本:
KEYLINES
设置为属于密钥文件的行数(7
),以便将行数输出到密钥文件,并将所有其他行输出到证书文件中;在这种情况下,CERTLINE
应为空。CERTLINE
设置为属于证书文件(-----BEGIN CERTIFICATE-----
)的第一行,因此这些行将输出到密钥文件,直到一行与该字符串匹配,在这种情况下,此行和所有进一步输出到证书文件; KEYLINES
应为空。