我需要将.CER转换为.CRT以获得Apache SSL证书吗? 如果是这样,怎么办?

Do I need to convert .CER to .CRT for Apache SSL certificates? If so, how?

我需要使用SSL设置Apache 2服务器。

我有我的* .key文件,但是我在网上找到了所有文档,指定了* .crt文件,而我的CA仅向我提供了* .cer文件。

* .cer文件与* .crt是否相同? 如果没有,如何将CER转换为CRT格式?


加密证书的文件扩展名并没有像您期望的那样标准化。 Windows默认情况下将双击.crt文件作为将证书导入Windows根证书存储的请求,但是将.cer文件当作对查看证书的请求。因此,它们在某种意义上是不同的,因为Windows双击每种类型的文件时会产生一些固有的不同含义。

但是,当您双击它们时Windows处理它们的方式大约是两者之间的唯一区别。这两个扩展名仅表示它包含一个公共证书。您可以重命名证书文件,以在我所看到的任何系统或配置文件中使用一个扩展名代替另一个扩展名。在非Windows平台(甚至Windows)上,人们对使用的扩展名不是特别小心,并且可以将它们互换使用,因为只要文件内容正确,它们之间就没有区别。

使事情更加混乱的是,有两种标准的方法将证书数据存储在文件中:一种是"二进制" X.509编码,另一种是通常以" -----BEGIN CERTIFICATE-----"开头的"文本" base64编码。这些编码相同的数据,但方式不同。大多数系统都接受两种格式,但是,如果需要,可以通过openssl或其他工具将其转换为另一种格式。证书文件中的编码实际上与某人给该文件的扩展名无关。


根据文档mod_ssl:

1
2
3
SSLCertificateFile:
   Name: SSLCertificateFile
   Description: Server PEM-encoded X.509 certificate file

证书文件应为PEM编码的X.509证书文件:

1
openssl x509 -inform DER -in certificate.cer -out certificate.pem


基本上有两种CER证书编码类型,即DER和Base64。当DER类型返回错误加载证书(asn1编码例程)时,请尝试PEM,它应能工作。

openssl x509 -inform DER -in certificate.cer -out certificate.crt

openssl x509 -inform PEM -in certificate.cer -out certificate.crt


我假设您有一个.cer文件,其中包含PKCS#7编码的证书数据,并且想要将其转换为PEM编码的证书数据(通常是.crt或.pem文件)。例如,一个包含PKCS#7编码数据的.cer文件如下所示:

1
2
3
4
5
6
-----BEGIN PKCS7-----
MIIW4gYJKoZIhvcNAQcCoIIW0zCCFs8CAQExADALBgkqhkiG9w0BBwGggha1MIIH
...
POI9n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G
+bKhADEA
-----END PKCS7-----

PEM证书数据如下所示:

1
2
3
4
5
-----BEGIN CERTIFICATE-----
MIIHNjCCBh6gAwIBAgIQAlBxtqKazsxUSR9QdWWxaDANBgkqhkiG9w0BAQUFADBm
...
nv72c/OV4nlyrvBLPoaS5JFUJvFUG8RfAEY=
-----END CERTIFICATE-----

有一个OpenSSL命令可以将.cer文件(带有PKCS#7数据)转换为您可能会遇到的PEM数据(上例中的BEGIN CERTIFICATE块)。您可以通过以下命令将PKCS#7数据强制转换为PEM格式,该文件称为certfile.cer:

openssl pkcs7 -text -in certfile.cer -print_certs -outform PEM -out certfile.pem

请注意,.cer或.pem文件可能包含一个或多个证书(可能是整个证书链)。


CER是DER编码的二进制形式的X.509证书。
CRT是二进制X.509证书,封装在文本(基本64)编码中。

它不是相同的编码。


如何将.cer文件转换为.crt文件(它们的编码方式不同!)的问题的答案是:

1
openssl pkcs7 -print_certs -in certificate.cer -out certificate.crt


我使用命令:

openssl x509 -inform PEM -in certificate.cer -out certificate.crt

但是CER是DER编码的二进制形式的X.509证书。
CRT是二进制X.509证书,封装在文本(基本64)编码中。

因此,您可能应该使用:

openssl x509 -inform DER -in certificate.cer -out certificate.crt

然后导入您的证书:

将您的CA复制到目录:

/usr/local/share/ca-certificates/

使用命令:

sudo cp foo.crt /usr/local/share/ca-certificates/foo.crt

更新CA存储:

sudo update-ca-certificates


如果您的cer文件为二进制格式,则必须通过

1
openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt

.cer和.crt文件应该可以互换,只要将它们导入密钥库即可。

看一下.cer文件的内容。擦除-----BEGIN CERTIFICATE-----行之前和-----END CERTIFICATE-----行之后的所有内容。您将剩下BEGIN / END行,它们之间有一堆Base64编码的内容。

1
2
3
4
5
-----BEGIN CERTIFICATE-----
MIIDQTCCAqqgAwIBAgIJALQea21f1bVjMA0GCSqGSIb3DQEBBQUAMIG1MQswCQYD
...
pfDACIDHTrwCk5OefMwArfEkSBo/
-----END CERTIFICATE-----

然后,只需使用keytool将其导入到您的密钥文件中即可。

1
keytool -import -alias myalias -keystore my.keystore -trustcacerts -file mycert.cer


做就是了

1
openssl x509 -req -days 365 -in server.cer -signkey server.key -out server.crt