如何创建可由 OpenSSL 命令行工具解析的单行 x509 证书

问题描述 投票:0回答:4

我想准备一个可以由 OpenSSL 命令行实用程序解析的单行 x509 证书字符串。

我使用 OpenSSL 命令行实用程序创建了私钥,

openssl genrsa -out privatekey.pem 1024

然后创建一个公钥,

openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 1825

证书的内容是,

$ openssl x509 -in publickey.cer
-----BEGIN CERTIFICATE-----
MIICZjCCAc+gAwIBAgIUUnH/2DwpRMsAkWtkE1jccev9FtwwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MTAxMTE0NDRaFw0yNDA5
MDgxMTE0NDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEB
BQADgY0AMIGJAoGBAJ1Z9/FRGmzCCB1F6txz2JMpHy+WNgvtPfyRQh6vjC3g7mcD
CHOPORT9vg/9ye2smr0gcPnkJwzA6ftaw0fWvHCXtVcb+cFs7xL3JbC7HexJQWFT
4fcQ6KhckTfn8qvkHdSMEX1y6+sFKFgftUgAtWmhRNnYTPaFEjFEjc8MVeM9AgMB
AAGjUzBRMB0GA1UdDgQWBBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAfBgNVHSMEGDAW
gBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4GBAAlemG77/vf1bvGlADLc+/sPeZ6ppuMz/y3qVRqfFJ+78RMTSrLW
SPGUyDFauTAvf7fNj+D/Pt+OrMue+AK+PCi0JxIWxIIv+XJqoSxHTwoBqujn93Xs
+vm03hED1aoCs/s7rSsckAR/OjkMtQDoVer/F0izuE7ebAh4IFYXYTUD
-----END CERTIFICATE-----

然后我使用下面的

awk 命令将换行符转换为 
\n

$ awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' publickey.cer | tee single_line_publickey.cer
转换后的证书是,

-----BEGIN CERTIFICATE-----\nMIICZjCCAc+gAwIBAgIUUnH/2DwpRMsAkWtkE1jccev9FtwwDQYJKoZIhvcNAQEL\nBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM\nGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MTAxMTE0NDRaFw0yNDA5\nMDgxMTE0NDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw\nHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAJ1Z9/FRGmzCCB1F6txz2JMpHy+WNgvtPfyRQh6vjC3g7mcD\nCHOPORT9vg/9ye2smr0gcPnkJwzA6ftaw0fWvHCXtVcb+cFs7xL3JbC7HexJQWFT\n4fcQ6KhckTfn8qvkHdSMEX1y6+sFKFgftUgAtWmhRNnYTPaFEjFEjc8MVeM9AgMB\nAAGjUzBRMB0GA1UdDgQWBBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAfBgNVHSMEGDAW\ngBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3\nDQEBCwUAA4GBAAlemG77/vf1bvGlADLc+/sPeZ6ppuMz/y3qVRqfFJ+78RMTSrLW\nSPGUyDFauTAvf7fNj+D/Pt+OrMue+AK+PCi0JxIWxIIv+XJqoSxHTwoBqujn93Xs\n+vm03hED1aoCs/s7rSsckAR/OjkMtQDoVer/F0izuE7ebAh4IFYXYTUD\n-----END CERTIFICATE-----\n
但是 OpenSSL 命令行工具无法解析此单行证书,

$ openssl x509 -in single_line_publickey.cer unable to load certificate 140671947637184:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
看起来无法找到封装边界

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
。从
RFC7468:PKIX、PKCS和CMS结构的文本编码标准中,我发现BEGIN CERTIFICATE
END CERTIFICATE
标签需要用换行符分隔。这里看起来 
\n
 不起作用。我尝试 
\r\n
 模拟 CR+LF 但仍然遇到同样的问题。

我观察到,当我将

BEGIN CERTIFICATE

END CERTIFICATE
 标签保留在换行符中时,OpenSSL 命令行工具能够解析证书。
证书文件是,

$ cat multi_line_publickey.cer -----BEGIN CERTIFICATE----- MIICZjCCAc+gAwIBAgIUUnH/2DwpRMsAkWtkE1jccev9FtwwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MTAxMTE0NDRaFw0yNDA5MDgxMTE0NDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ1Z9/FRGmzCCB1F6txz2JMpHy+WNgvtPfyRQh6vjC3g7mcDCHOPORT9vg/9ye2smr0gcPnkJwzA6ftaw0fWvHCXtVcb+cFs7xL3JbC7HexJQWFT4fcQ6KhckTfn8qvkHdSMEX1y6+sFKFgftUgAtWmhRNnYTPaFEjFEjc8MVeM9AgMBAAGjUzBRMB0GA1UdDgQWBBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAfBgNVHSMEGDAWgBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAAlemG77/vf1bvGlADLc+/sPeZ6ppuMz/y3qVRqfFJ+78RMTSrLWSPGUyDFauTAvf7fNj+D/Pt+OrMue+AK+PCi0JxIWxIIv+XJqoSxHTwoBqujn93Xs+vm03hED1aoCs/s7rSsckAR/OjkMtQDoVer/F0izuE7ebAh4IFYXYTUD -----END CERTIFICATE-----
OpenSSL 工具能够解析它,

$ openssl x509 -in multi_line_publickey.cer -noout -subject subject=C = AU, ST = Some-State, O = Internet Widgits Pty Ltd
但这里我有三行。如何以 OpenSSL 命令行实用程序可以解析的方式将此证书准备为一行?

openssl certificate ssl-certificate x509certificate x509
4个回答
4
投票
我想准备一个可以由 OpenSSL 命令行实用程序解析的单行 x509 证书字符串...

-----BEGIN CERTIFICATE----- MIICZjCCAc+gAwIBAgIUUnH/2DwpRMsAkWtkE1jccev9FtwwDQYJKoZIhvcNAQELBQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xOTA5MTAxMTE0NDRaFw0yNDA5MDgxMTE0NDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ1Z9/FRGmzCCB1F6txz2JMpHy+WNgvtPfyRQh6vjC3g7mcDCHOPORT9vg/9ye2smr0gcPnkJwzA6ftaw0fWvHCXtVcb+cFs7xL3JbC7HexJQWFT4fcQ6KhckTfn8qvkHdSMEX1y6+sFKFgftUgAtWmhRNnYTPaFEjFEjc8MVeM9AgMBAAGjUzBRMB0GA1UdDgQWBBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAfBgNVHSMEGDAWgBQ+mp9v3pEw5Oy4FiE3Go9vs/56zzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4GBAAlemG77/vf1bvGlADLc+/sPeZ6ppuMz/y3qVRqfFJ+78RMTSrLWSPGUyDFauTAvf7fNj+D/Pt+OrMue+AK+PCi0JxIWxIIv+XJqoSxHTwoBqujn93Xs+vm03hED1aoCs/s7rSsckAR/OjkMtQDoVer/F0izuE7ebAh4IFYXYTUD -----END CERTIFICATE-----

PEM 编码在 RFC 1421,

Internet 电子邮件的隐私增强中有详细说明。在规格中,它说:

    封装边界位于各自的线上,
  • 消息采用 Base64 编码,
  • 行数限制为 64 个字符,
  • 行尾为 CR (' ') 和 LF (' ')
OpenSSL 从来没有很好地处理格式错误的证书。从我记事起,情况就一直如此。相当多的库不能很好地处理 EOL。他们也被 CRLF 行尾噎住了。

相比之下,OpenSSH 文件格式 RFC,

RFC 4716 表示实现必须处理 CR、LF 或 CRLF 的 eol。 RFC 还表示证书和密钥应使用本机平台约定编写,因此您将在现场看到所有三个。


2
投票
你可以使用一些黑魔法来获得你想要的东西。如果您看到

single_line_publickey.cer

,则它也具有 
\n
 字符,当您回显时会显示这些字符。这意味着您可以强制 echo 将它们打印为换行符。

如果您尝试以下操作:

echo -ne $(cat single_line_publickey.cer) | openssl x509 -noout -text

效果应该很好。


2
投票
如果您不介意 awk 的黑暗魔法,请继续。

没有

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----
 新行:

awk 'NR>2 { sub(/\r/, ""); printf "%s",last} { last=$0 }' ca.crt
证书包括页眉、页脚,不带换行符:

awk 'NF {sub(/\r/, ""); printf "%s",$0;}' ca.crt
证书包括页眉、页脚和换行符,如 

\n


awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' ca.crt
    

0
投票
使用类似的逻辑来匹配公钥 - 但稍作修改。

假设:您在当前文件夹中有一个 PEM 格式的公钥列表,如“*.pub”,并且您知道要匹配的单行公钥:

the_key='public key to match' (for i in *.pub ; do foo=`awk 'NR>1 { sub(/\r/, ""); printf "%s",last} { last=$0 }' $i | sed -e 's/^-----.*-----//'` ; echo "$i: $foo" ; done) \ | grep "$the_key"
这会显示文件和匹配的公钥。应该适合搜索单行证书(例如,如果您的所有证书都使用该名称,请将“

.pub”更改为“.crt”)。

© www.soinside.com 2019 - 2024. All rights reserved.