给Nginx配置一个自签名的SSL证书

更新时间:2018-10-06 分类:网络技术 浏览量:2005

https-SSL

要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择。HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上。
SSL使用证书来创建安全连接。有两种验证模式:

仅客户端验证服务器的证书,客户端自己不提供证书;

客户端和服务器都互相验证对方的证书。

显然第二种方式安全性更高,一般用网上银行会这么搞,但是,普通的Web网站只能采用第一种方式。

客户端如何验证服务器的证书呢?服务器自己的证书必须经过某“权威”证书的签名,而这个“权威”证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威的证书就称为根证书。根证书直接内置在浏览器中,这样,浏览器就可以利用自己自带的根证书去验证某个服务器的证书是否有效。

如果要提供一个有效的证书,服务器的证书必须从VeriSign这样的证书颁发机构签名,这样,浏览器就可以验证通过,否则,浏览器给出一个证书无效的警告。

申请一个证书签名的费用是一年几十~几百刀不等,所以如果只是出于管理目的,可以创建自签名证书,保证管理员通过浏览器安全连接到服务器。

下面简单介绍如何创建一个自签名的SSL证书。

创建自签名证书需要安装openssl,使用以下步骤:

创建Key;

创建签名请求;

将Key的口令移除;

用Key签名证书。

为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证。(PS:廖雪峰的官方网站提供的脚本个人测试未通过,建议采用下面的手动操作。)

一、把证书准备好

1、制作CA证书:

ca.key CA私钥:


openssl genrsa -des3 -out ca.key 2048

制作解密后的CA私钥(一般无此必要):


openssl rsa -in ca.key -out ca_decrypted.key

ca.crt CA根证书(公钥):


openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

2、制作生成网站的证书并用CA签名认证

在这里,假设网站域名为 imhaui.com ,生成 imahui.com 证书私钥:


openssl genrsa -des3 -out imahui.com.pem 1024

制作解密后的 imahui.com 证书私钥:


openssl rsa -in imahui.com.pem -out imahui.com.key

生成签名请求:


openssl req -new -key blog.creke.net.pem -out blog.creke.net.csr

在common name中填入网站域名,如 www.imahui.com 即可生成改站点的证书,同时也可以使用泛域名如 *.imahui.com 来生成所有二级域名可用的网站证书。


Country Name (2 letter code) [XX]:CN

State or Province Name (full name) []: 省份

Locality Name (eg, city) [Default City]: 城市

Organization Name (eg, company) [Default Company Ltd]: 公司名称

Organizational Unit Name (eg, section) []: 组织名称

Common Name (eg, your name or your server's hostname) []: 待加密的网址

Email Address []: 管理员邮箱, 如果你要申请正式CA颁发的证书,请填写whois的注册邮箱

用CA进行签名:


openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in imahui.com.csr -out imahui.com.crt

其中,policy参数允许签名的CA和网站证书可以有不同的国家、地名等信息,days参数则是签名时限。

如果在执行签名命令时,出现“I am unable to access the ../../CA/newcerts directory”

修改/etc/pki/tls/openssl.cnf中“dir = ./CA”

然后:


mkdir -p CA/newcerts

touch CA/index.txt

touch CA/serial

echo "01" > CA/serial

再重新执行签名命令。

最后,把ca.crt的内容粘贴到 imahui.com.crt 后面。这个比较重要!因为不这样做,可能会有某些浏览器不支持。

好了,现在https需要到的网站私钥 imahui.com.key 和网站证书 imahui.com.crt 都准备完毕。接下来开始配置服务端。

Web服务器需要把 imahui.com.crt 发给浏览器验证,然后用 imahui.com.key 解密浏览器发送的数据,剩下两个文件不需要上传到Web服务器上。

二、配置Nginx

以Nginx为例,需要在 server {...} 中配置:


server {
    ...
    ssl on;
    ssl_certificate     /etc/nginx/ssl/imahui.com.crt; # 注意证书路径
    ssl_certificate_key /etc/nginx/ssl/imahui.com.key; # 注意证书路径
}

如果一切顺利,打开浏览器,就可以通过HTTPS访问网站。第一次访问时会出现警告(因为我们的自签名证书不被浏览器信任),把证书通过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,以后该电脑访问网站就可以安全地连接Web服务器了:

liaoxuefeng

如何在应用服务器中配置证书呢?例如Tomcat,gunicorn等。正确的做法是不配置,让Nginx处理HTTPS,然后通过proxy以HTTP连接后端的应用服务器,相当于利用Nginx作为HTTPS到HTTP的安全代理,这样即利用了Nginx的HTTP/HTTPS处理能力,又避免了应用服务器不擅长HTTPS的缺点。

出处:廖雪峰的官方网站 && 梦溪博客

相关阅读

免费SSL证书Let’s Encrypt安装使用教程

Nginx 配置 HTTPS 服务器

Nginx配置SSL加密(单双向认证、部分https)