如何从cert.pem和key.pem获取.crt和.key文件

7

我知道这个问题和其他许多问题非常相似,但它们中没有一个给出明确的答案或适用于我...

我从Let's Encrypt获得了两个文件:

  • cert.pem
  • key.pem

我需要将它们转换为crtkey格式以在nginx服务器上使用。

我尝试过:

openssl rsa -outform der -in key.pem -out key.key

openssl x509 -outform der -in cert.pem -out cert.crt

但在启动nginx时会出现以下错误:

# service nginx restart
Performing sanity check on nginx configuration:
nginx: [emerg] cannot load certificate "/etc/ssl/nginx/cert.crt": PEM_read_bio_X509_AUX() failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

2
文件名中的扩展名不计入其中。PEM是一种编码格式,它可以是密钥或一个(或多个)证书。如果您想要的话,您可以将cert.pem重命名为whatever.crt,将key.pem重命名为whatever.key,这样就可以正常工作了,无需转换。没有crtkey格式。您只有二进制格式(称为DER)或Base64编码格式(PEM)。顺便说一句,您的问题与编程无关,不属于此处的主题。 - Patrick Mevzek
搞定了,谢谢。我原以为需要以不同的格式设置键。如果您将您的评论作为答案,我会标记它为已接受。这个网站上有很多关于证书/ SSL 的问题,所以我认为这没问题。 - Snappawapa
2个回答

17
该扩展名.pem表示文件格式为PEM(隐私增强电子邮件)。但是,扩展名并没有提供有关文件内容的任何信息。内容可能是证书、私钥、公钥或其他内容。
该扩展名.crt表示文件内容为证书。但是,扩展名并没有提供有关文件格式的任何信息。文件格式可能是PEM、DER(分层编码规则)或其他格式。如果文件是文本,并包含-----BEGIN CERTIFICATE-----,则文件格式为PEM。另一方面,如果文件是二进制文件,则很可能文件格式为DER。
该扩展名.key表示文件内容为私钥。但是,扩展名并没有提供有关文件格式的任何信息。文件格式可能是PEM、DER或其他格式。如果文件是文本,并包含-----BEGIN PRIVATE KEY-----(或类似内容),则文件格式为PEM。另一方面,如果文件是二进制文件,则很可能文件格式为DER。
来自"Illustrated X.509 Certificate"的下图说明了ASN.1X.680)、DERX.690)、BASE64RFC 4648)和PEMRFC 7468)之间的关系。

relationship among ASN.1, DER, BASE64 and PEM

relationship among ASN.1, DER, BASE64 and PEM (Application to X.509 Certificate

ssl_certificatessl_certificate_key都是ngx_http_ssl_module模块中的指令,参考文档说明它们期望的文件格式为PEM。因此,您不必更改cert.pemkey.pem的文件格式,因为它们的文件扩展名.pem已经表明它们的文件格式是PEM。只需像下面这样在Nginx配置文件中编写即可。

ssl_certificate     /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

如果您更喜欢使用扩展名为.crt.key的文件,只需按以下方式重命名即可。
$ mv cert.pem cert.crt
$ mv key.pem  key.key

0

当您想要使用Let's Encrypt设置NGINX时,可以通过使用应用程序certbot自动完成。

安装nginx的certbot:

在Ubuntu/Debian上:

sudo apt install python-certbot-nginx

在Arch Linux上:
sudo pacman -S certbot-nginx

在Centos上:

sudo yum install epel-release
sudo yum install certbot-nginx

然后,您需要为您的域名创建一个非常简单的配置文件。该目录应对所有提到的操作系统保持一致。

/etc/nginx/sites-available/example.com

在这里,你只需要添加这些信息:

server {
        listen 80;
        listen [::]:80;
        
        server_name example.com www.example.com;

        location / {
                proxy_pass http://127.0.0.1:5000 #Example
        }
}

然后创建符号链接以激活域名

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

请记得将 example.com 更改为您自己的域名,并将 proxy_pass 切换为您托管文件的服务或目录。

现在您应该重新启动 NGINX:

sudo nginx -t

如果您的配置文件中存在错误,此命令将返回一个错误。

如果一切正常,请重新启动NGINX。

sudo systemctl restart nginx.service

现在 certbot 出现在画面中:

sudo certbot --nginx -d example.com -d www.example.com

此时,Let's Encrypt 将尝试连接您的 Nginx 服务器,如果一切正常 - 这意味着:

  • 防火墙设置允许端口 80 和 443 通过
  • 网络中的端口转发允许通过这两个端口

然后,您将可以选择 简单安全 访问。我建议选择 安全 选项。

当您点击 [enter] 后,该过程将完成,Certbot 将生成所有证书文件并将它们添加到正确的路径中。

您的配置文件在 /etc/nginx/sites-avalible/example.com 中将被更新为所有正确的设置。

您可能需要再次重新启动 Nginx。

希望这对您有所帮助。祝您好运!

[来源]

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04

https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-centos-7

https://wiki.archlinux.org/index.php/Certbot#Nginx


谢谢提供信息,但我已经找到了相关指南,只需要帮助格式化密钥 :) - Snappawapa
我的意思只是说手动格式化键不是必要的 :) - mama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接