Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Certificate 从PEM格式证书和PEM格式公钥生成DER格式公钥_Certificate_Ssl Certificate - Fatal编程技术网

Certificate 从PEM格式证书和PEM格式公钥生成DER格式公钥

Certificate 从PEM格式证书和PEM格式公钥生成DER格式公钥,certificate,ssl-certificate,Certificate,Ssl Certificate,在被击中之前,我采取了以下步骤 1) 我通过使用获得了服务器的证书 s_client -connect hostname.org:443 -showcerts 证书看起来不错 -----BEGIN CERTIFICATE----- MIIICTCCBvGgAwIBAgIQA8mdxgOCgSdtPdwJY/c3FzANBgkqhkiG9w0BAQsFADBk MQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDESMBAGA1UEBxMJ an

在被击中之前,我采取了以下步骤

1) 我通过使用获得了服务器的证书

 s_client -connect hostname.org:443 -showcerts
证书看起来不错

-----BEGIN CERTIFICATE-----
MIIICTCCBvGgAwIBAgIQA8mdxgOCgSdtPdwJY/c3FzANBgkqhkiG9w0BAQsFADBk
MQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDESMBAGA1UEBxMJ
and so on
-----END CERTIFICATE-----
2) 我将其保存为myCert.pem文件。(我不确定是否应将其保存为.cer文件)

3) 我提取了PEM格式的公钥,形成上面保存的证书文件,使用

openssl x509 -pubkey -noout -in myCert.pem > pubkey.pem
PEM格式的公钥看起来也不错

-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwFQpwmpIDxhGeuKGxn1a
oWOytrvD5m6dQLv9EUEWkCZPNr48su3G2vGxWtUNNU5kA8lYxGo4kqo1R2J8nM6I
CXANY3tO6/j82AueiK93qTTFdJVDTjtYUd8CI9frzxQ+XyJvBeIj3l0tNLsND4HD
hSV+dteikKGiAwXOR0SA4pUyMCNuO1xqyK0YI2eZvQCOLpXd1DMyV7bmPUJINvwV
nT3iweeaBiX6HHXbSb/zHvAQZzOti939D/NTbLbJwSBYxnUR9uBR/JtcfZaoSjEa
1QHCIPgLJ2oQT/udCdb66IHEZfrjNHArQC3prXvuV25S043VlqssdVQnSz0bV+Tk
+CK3D2Ht42QKewVx6/uFzuf0btkMvhxvY6zLmM4UhRDFhMKbewsI9tAV7tKBdwtc
qYSuFvRLFdJWx1WsUsHhMWE34AVYUu/ocAOsiTBtsLfLR0OPNB05RZI7x6XJL3XV
PCnkIw4nfHf8fqyXfBkqkSBlNVL26t+bVW9E3ksl9eqh4VxZl6XGLOy0jBc8/96E
iRJaydsutraiqevdAwvRkebj2SR0pXLwigZFXm1hPSrtI7cuytsfqNE4DNwD+yQw
d/iMyiPgxG0Mv9fmmpx8VHNNkchhrtDRIvZx6C11eaZ0Ng7Y4JCFtnAfL3XbBCXB
Y8y052YLhGd+lE4/J76bAokCAwEAAQ==
-----END PUBLIC KEY-----

现在我正在尝试将此PEM格式公钥解码为der格式。我该怎么做呢?

PEM编码的文件是页眉、页脚和base64编码的内容(对于证书、密钥和其他内容,是BER/DER编码的数据)

当OpenSSL写入数据时,它使用来自DER的约束(据我所见),因此对于OpenSSL写入的数据,您只需要对内容进行base64解码
opensslbase64-d
将实现这一点(忽略PEM页眉/页脚)

如果您担心PEM内容是合法的BER而不是合法的DER(例如,它使用了不定长度的构造值),您可以要求OpenSSL读写它

openssl rsa -pubin -in pubkey.key -outform der -out pubkey.der
或者,以编程方式

FILE* fp = fopen("pubkey.key", "r");
EVP_PKEY* pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
fp = fopen("pubkey.der", "wb");
i2d_PUBKEY_fp(fp, pkey);
fclose(fp);
EVP_PKEY_free(pkey);

可以选择进行错误检查。

使用上述两个命令时,将创建一个文件。当我试图打开此文件时,我得到“此文件无效,无法用作以下内容:安全证书”。当我在记事本++中打开它时,我只看到像0这样的胡言乱语“0*†H†÷0”我如何知道创建了DER格式的有效公钥?@overflow DER是二进制格式,而不是文本格式。这是一个密钥,不是证书。你可以把它扔向像这样的工具,或者你可以要求另一个工具或库来阅读它,看看它是否可以。在一天结束时,你需要一些数据,这些数据要么有效,要么无效(如果无效,一个更具体的问题可能会更容易回答)。我想看看它是否有效。现在你共享的工具可以阅读了,我很满意。谢谢你的帮助。
FILE* fp = fopen("pubkey.key", "r");
EVP_PKEY* pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
fp = fopen("pubkey.der", "wb");
i2d_PUBKEY_fp(fp, pkey);
fclose(fp);
EVP_PKEY_free(pkey);