Nginx配置SSL安全证书及解决PEM_read_bio:bad end line error错误

在StartSSL上申请了免费一年的证书,把申请到的key和crt文件放到/usr/local/nginx/conf/ssl/目录下,并命名为ssl.key和ssl.crt,对于申请的StartCOM Class1证书还需要以下命令,合并证书链:

wget http://cert.startssl.com/certs/ca.pem
wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
mv ca.pem startssl.ca.crt
mv sub.class1.server.ca.pem startssl.sub.class1.server.ca.crt
cat startssl.sub.class1.server.ca.crt startssl.ca.crt > startssl.chain.class1.server.crt
cat ssl.crt startssl.chain.class1.server.crt > yourdomain.chained.crt

然后修改Nginx的配置文件nginx.conf如下:

# 下面这段是强制80端口非SSL客户端转向至https安全连接
# 如果希望保留http非安全连接,请去掉这里
server {
  listen 80;
  server_name www.example.com; # 你自己的域名
  rewrite ^(.*) https://$server_name$1 permanent;
}
 
# 这里是SSL的相关配置
server {
  listen 443 ssl;
  server_name www.example.com; # 你自己的域名
  root /home/www; # 你的网站目录
  ssl on;
  ssl_certificate /usr/local/nginx/conf/ssl/yourdomain.chained.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/ssl.key;
}

nginx官方SSL相关资料:http://nginx.org/en/docs/http/configuring_https_servers.html#chains

使用下面的命令重启nginx服务

/etc/init.d/nginx restart

一般情况下nginx能正常重启,并且SSL证书可以正确配置,但是有时会出现下面的错误提示:

[emerg]: SSL_CTX_use_certificate_chain_file("/usr/local/nginx/conf/ssl/server.crt")
 failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib)
configuration file /usr/local/nginx/conf/nginx.conf test failed

这个的意思就是ssl.crt读取到意外错误行,回忆一下刚才的操作,这个是StartSSL提供的crt证书,然后我们使用cat将证书链合并到这个证书里的,那么问题可能就出在合并这个环节,使用vi或者nano命令打开并编辑ssl.crt,果然让我们找到了问题所在:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

可以看到原先占用一行的标记证书的分隔符,现在连到一起了,我们需要用换行将他们分开,注意问题左右的短横线最好一样多:

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----- 

好,做好后,保存这个crt文件,再次重启Nginx服务,输入申请证书时私钥的密码,SSL启用成功!

点赞