Nginx服务器使用自签ca配置https加密访问
时间:2013-11-04 来源:服务器之家 投稿:root
width="300" height="250" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" id="aswift_0" name="aswift_0" style="left: 0px; position: absolute; top: 0px; border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; border: 1px solid rgba(0, 0, 0, 0); box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;">
id="cproIframe_u1371555_4" width="300" height="250" src="http://pos.baidu.com/acom?adn=3&at=166&aurl=&cad=1&ccd=24&cec=GBK&cfv=18&ch=0&col=zh-CN&conOP=0&cpa=1&dai=4&dis=0&layout_filter=rank%2Ctabcloud<r=<u=http%3A%2F%2Fwww.server110.com%2Fnginx%2F201311%2F3089.html&lunum=6&n=71038079_cpr&pcs=1920x951&pis=10000x10000&ps=541x811&psr=1920x1080&pss=1920x802&qn=004333519b999911&rad=&rsi0=300&rsi1=250&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=1371555&tn=text_default_300_250&tpr=1445588831999&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1371555&ti=Nginx%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BD%BF%E7%94%A8%E8%87%AA%E7%AD%BEca%E9%85%8D%E7%BD%AEhttps%E5%8A%A0%E5%AF%86%E8%AE%BF%E9%97%AE%20-%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E5%AE%B6&tt=1445588831952.382.527.528" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">
今天闲得没事,给我的VPS配置了HTTP SSL加密传输也就是 https;亲,现在用https://也可以访问我的博客了哦!纯属折腾,学习一下NGINX的HTTPS配置方法,顺便在这里也记录一下笔记;PS:Nginx配置启用htts真的好简单!
由于采用的CA是用VPS本机的Openssl自签名生成的,因此是无法通过互联网公信Root CA验证的,所以会出现该网站安全证书无效的提示,直接点击“继续访问(不推荐)”即可!
HTTPS的原理和访问过程:
服务器必要条件:
一个服务器私钥 KEY文件
一张与服务器域名匹配的CA证书(公钥,根据私钥key生成)
访问过程:
1,客户端浏览器通过https协议访问服务器的443端口,并获得服务器的证书(公钥);客户端浏览器这时候会去找一些互联网可信的RootCA(权威证书颁发机构)验证当前获取到的证书是否合法有效,PS:这些RootCA是随操作系统一起预设安装在了系统里面的;
2,如果RootCA验证通过,表示该证书是可信的,并且若证书中标注的服务器名称与当前访问的服务器URL地址一致,就会直接使用该证书中包含的公钥解密服务器通过自己的KEY(私钥)加密后传输过来的网页内容,从而正常显示页面内容;
3,如果RootCA验证不通过,说明该证书是未获得合法的RootCA签名和授权,因此也就无法证明当前所访问的服务器的权威性,客户端浏览器这时候就会显示一个警告,提示用户当前访问的服务器身份无法得到验证,询问用户是否继续浏览!(通常自签名的CA证书就是这种情况)
这里需要注意,验证CA的有效性,只是证明当前服务器的身份是否合法有效,是否具有公信力以及身份唯一性,防止其他人仿冒该网站;但并不会影响到网页的加密功能,尽管CA证书无法得到权威证明,但是它所包含的公钥和服务器上用于加密页面的私钥依然是匹配的一对,所以服务器用自己的私钥加密的网页内容,客户端浏览器依然是可以用这张证书来解密,正常显示网页内容,所以当用户点击“继续浏览此网站(不推荐)”时,网页就可以打开了;
证书有效性引用场景:
如果单纯只要求实现网页加密传输的功能,保证网页数据再传输过程中的安全,不要求对用户证明该网站的唯一权威性,则可以忽略证书的合法性,普通自签名的证书即可;只是用户访问时需要多一个点击“继续浏览”的动作;
如果网站需要像用户证明自己的权威性,以及唯一性(比如银行的交易网站);不仅数据要求加密传输,而且网站身份也要求是权威的,不可仿冒的;因此这种场景下,就必须使用通过权威证书颁发机构(RootCA)签名过的合法证书,用户的浏览器能正常验证该证书的和所访问的服务器的身份确实是属于该组织的;
小提示:我们在访问像银行,支付宝等等这些涉及金钱交易的网站时,这些重要的网站他们的HTTPS服务器证书肯定都是合法经过权威签名的合法可信证书,是不会出现安全证书错误的讯息的;如果你访问这样的网站,浏览器提示安全证书错误,你就要千万小心了,因为你访问的很可能是别人仿冒的钓鱼网站,诱骗你上当,骗取你的账号密码信息!因为网站内容可以仿冒的一模一样,但是合法的安全证书是无法仿冒的,所以IE会警告证书错误!这时你就千万不要点击“继续浏览(不推荐)”的选项,而应该果断点击窗口右上角的X按钮;
打个通俗的比方,服务器证书是否拥有合法签名,就好比你的身份证上是否有派出所给你压了钢印一样,并且这个钢印是别人无法仿冒的,任何人都可以在派出所验证你身份证上压的钢印是否有效,来确认你本人的身份,坏分子是无法用假冒的身份证来冒充你干坏事的!
合法证书的申请流程:
如果你想拥有一张派出所颁发的并且压了钢印的所有人都承认的身份证,你就必须去派出所申请注册你的身份,派出所会详细审核你的信息对你本人验明正身,可能还要收取一定费用,审核通过后就会颁发一个合法身份证给你了;
合法的服务器证书申请流程也跟上面的过程一样,你需要找一家权威的CA证书颁发机构(派出所)这个机构的权威性是得到全世界的计算机认可的。然后提交证书申请,需要包含详细的公司信息,负责人联系方式,证书用途等等,这个CA证书权威机构会审核你提交的信息,甚至会和你以及你的公司联系确认身份,然后缴纳一定费用,等审核通过就可以颁发下来了;虽然很麻烦,但是它具有权威性!这样的权威机构很多,著名的如:VeriSign GlobalSign 等等
自签名CA生成证书
1,用Openssl随机生成服务器密钥,和证书申请文件CSR
#mkdir /etc/cert //建立证书和key的保存目录,路径自己决定;
#cd /etc/cert
#openssl genrsa -out server110.com.key 1024 //生成1024位加密的服务器私钥server110.com.key
#openssl req -new -key server110.com.key -out server110.com.csr //制作CSR证书申请文件,需要填写很多信息!
————制作CSR问题回答过程,红色为输入内容————-
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ’.', the field will be left blank.
—–
Country Name (2 letter code) [GB]:CN //填写国码CN
State or Province Name (full name) [Berkshire]:ShangHai //省份
Locality Name (eg, city) [Newbury]:ShangHai //城市
Organization Name (eg, company) [My Company Ltd]:server110.com //公司组织名称,自己随便填;
Organizational Unit Name (eg, section) []:IT-Department //部门名称,可以随便填;
Common Name (eg, your name or your server’s hostname) []:www.server110.com //服务器名称,这里注意了,一定要填写你网站的完整域名,因为浏览器会验证证书中的这个服务器名称和访问的服务器URL是否匹配!
Email Address []:moon@server110.com //管理员,负责人邮件地址,可以填写你自己的邮箱;
Please enter the following ’extra’ attributes
to be sent with your certificate request //这里的提示是说如果你想通过第三方权威证书签名机构给你签名这张证书,则需要认真回答下面的问题,我们做自签名,也就是自己给自己压个钢印,所以不需要这么严格了,后面的2个问题就直接回车跳过即可!
A challenge password []:
An optional company name []:
问题回答完毕后,就会生成一个 server110.com.csr文件,这个CSR文件的作用就用于提交给RootCA审核并签发证书的,也就是要给到派出所的警察蜀黍审核的材料,所以回答的各项问题一定要正确和仔细,否则他是不会给你压钢印的;
这里我们就不提交派出所了,直接自己给自己压一个假的钢印好了,只要能加密就行,不考虑权威性,接着往下走;
2,自己给自己签发证书
openssl x509 -req -days 3650 -in server110.com.csr -signkey server110.com.key -out server110.com.crt
-days 3650 证书的有效期,自己给自己颁发证书,想有多久有效期,就弄多久,我一下弄了10年的有效期;
-in server110.com.csr 指定CSR文件
-signkey server110.com.key 指定服务器的私钥key文件
-out server110.com.crt 设置生成好的证书文件名
一条命令,自己给自己压钢印的身份证 server110.com.crt 就诞生了!
注:其实严格来讲,这里生成的只是一张RootCA,并不是严格意义上的服务器证书 ServerCA,真正的ServerCA是需要利用这张RootCA再给服务器签署办法出来的证书才算;不过我们这里只讲如何实现网页的SSL加密,所以就直接使用RootCA了,也是能正常实现加密功能的!
NGINX配置启用HTTPS
key和证书都有了,现在配置Nginx使用这个张证书和KEY对网站进行加密;
https的配置,只需要在 nginx的配置文件后面增加一个 server段的配置即可,内容如下:
# HTTPS server
server {
listen 443; //监听端口443
server_name www.server110.com;
ssl on; //启用SSL加密
ssl_certificate /etc/cert/server110.com.crt; //服务器证书文件
ssl_certificate_key /etc/cert/server110.com.key; //服务器私钥key文件
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; //支持的SSL加密协议版本
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
—————–以下网站内容location部分的配置就和HTTP的部分一样了,可以直接copy过来————
index index.html index.htm index.php;
root /home/moonfly-root;
location / {
………
}
配置文件修改完毕后,用nginx -t 测试下配置无误,就reload一下nginx服务,检查443端口是否在监听:
#/usr/local/nginx/sbin/ngint -t //测试配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful //显示表示配置文件没有错误
#service nginx reload //重新加载nginx服务
#netstat -lan | grep 443 //查看443端口
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN //有看到这一行,就表示HTTPS已经在工作了
#
现在已经可以通过HTTPS访问网站了
显示证书详情:
由于采用的CA是用VPS本机的Openssl自签名生成的,因此是无法通过互联网公信Root CA验证的,所以会出现该网站安全证书无效的提示,直接点击“继续访问(不推荐)”即可!
HTTPS的原理和访问过程:
服务器必要条件:
一个服务器私钥 KEY文件
一张与服务器域名匹配的CA证书(公钥,根据私钥key生成)
访问过程:
1,客户端浏览器通过https协议访问服务器的443端口,并获得服务器的证书(公钥);客户端浏览器这时候会去找一些互联网可信的RootCA(权威证书颁发机构)验证当前获取到的证书是否合法有效,PS:这些RootCA是随操作系统一起预设安装在了系统里面的;
2,如果RootCA验证通过,表示该证书是可信的,并且若证书中标注的服务器名称与当前访问的服务器URL地址一致,就会直接使用该证书中包含的公钥解密服务器通过自己的KEY(私钥)加密后传输过来的网页内容,从而正常显示页面内容;
3,如果RootCA验证不通过,说明该证书是未获得合法的RootCA签名和授权,因此也就无法证明当前所访问的服务器的权威性,客户端浏览器这时候就会显示一个警告,提示用户当前访问的服务器身份无法得到验证,询问用户是否继续浏览!(通常自签名的CA证书就是这种情况)
![Nginx配置HTTPS Nginx配置HTTPS](http://upload.server110.com/image/20131103/1TK2HR-0.jpg)
这里需要注意,验证CA的有效性,只是证明当前服务器的身份是否合法有效,是否具有公信力以及身份唯一性,防止其他人仿冒该网站;但并不会影响到网页的加密功能,尽管CA证书无法得到权威证明,但是它所包含的公钥和服务器上用于加密页面的私钥依然是匹配的一对,所以服务器用自己的私钥加密的网页内容,客户端浏览器依然是可以用这张证书来解密,正常显示网页内容,所以当用户点击“继续浏览此网站(不推荐)”时,网页就可以打开了;
证书有效性引用场景:
如果单纯只要求实现网页加密传输的功能,保证网页数据再传输过程中的安全,不要求对用户证明该网站的唯一权威性,则可以忽略证书的合法性,普通自签名的证书即可;只是用户访问时需要多一个点击“继续浏览”的动作;
如果网站需要像用户证明自己的权威性,以及唯一性(比如银行的交易网站);不仅数据要求加密传输,而且网站身份也要求是权威的,不可仿冒的;因此这种场景下,就必须使用通过权威证书颁发机构(RootCA)签名过的合法证书,用户的浏览器能正常验证该证书的和所访问的服务器的身份确实是属于该组织的;
小提示:我们在访问像银行,支付宝等等这些涉及金钱交易的网站时,这些重要的网站他们的HTTPS服务器证书肯定都是合法经过权威签名的合法可信证书,是不会出现安全证书错误的讯息的;如果你访问这样的网站,浏览器提示安全证书错误,你就要千万小心了,因为你访问的很可能是别人仿冒的钓鱼网站,诱骗你上当,骗取你的账号密码信息!因为网站内容可以仿冒的一模一样,但是合法的安全证书是无法仿冒的,所以IE会警告证书错误!这时你就千万不要点击“继续浏览(不推荐)”的选项,而应该果断点击窗口右上角的X按钮;
打个通俗的比方,服务器证书是否拥有合法签名,就好比你的身份证上是否有派出所给你压了钢印一样,并且这个钢印是别人无法仿冒的,任何人都可以在派出所验证你身份证上压的钢印是否有效,来确认你本人的身份,坏分子是无法用假冒的身份证来冒充你干坏事的!
合法证书的申请流程:
如果你想拥有一张派出所颁发的并且压了钢印的所有人都承认的身份证,你就必须去派出所申请注册你的身份,派出所会详细审核你的信息对你本人验明正身,可能还要收取一定费用,审核通过后就会颁发一个合法身份证给你了;
合法的服务器证书申请流程也跟上面的过程一样,你需要找一家权威的CA证书颁发机构(派出所)这个机构的权威性是得到全世界的计算机认可的。然后提交证书申请,需要包含详细的公司信息,负责人联系方式,证书用途等等,这个CA证书权威机构会审核你提交的信息,甚至会和你以及你的公司联系确认身份,然后缴纳一定费用,等审核通过就可以颁发下来了;虽然很麻烦,但是它具有权威性!这样的权威机构很多,著名的如:VeriSign GlobalSign 等等
自签名CA生成证书
1,用Openssl随机生成服务器密钥,和证书申请文件CSR
#mkdir /etc/cert //建立证书和key的保存目录,路径自己决定;
#cd /etc/cert
#openssl genrsa -out server110.com.key 1024 //生成1024位加密的服务器私钥server110.com.key
#openssl req -new -key server110.com.key -out server110.com.csr //制作CSR证书申请文件,需要填写很多信息!
————制作CSR问题回答过程,红色为输入内容————-
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ’.', the field will be left blank.
—–
Country Name (2 letter code) [GB]:CN //填写国码CN
State or Province Name (full name) [Berkshire]:ShangHai //省份
Locality Name (eg, city) [Newbury]:ShangHai //城市
Organization Name (eg, company) [My Company Ltd]:server110.com //公司组织名称,自己随便填;
Organizational Unit Name (eg, section) []:IT-Department //部门名称,可以随便填;
Common Name (eg, your name or your server’s hostname) []:www.server110.com //服务器名称,这里注意了,一定要填写你网站的完整域名,因为浏览器会验证证书中的这个服务器名称和访问的服务器URL是否匹配!
Email Address []:moon@server110.com //管理员,负责人邮件地址,可以填写你自己的邮箱;
Please enter the following ’extra’ attributes
to be sent with your certificate request //这里的提示是说如果你想通过第三方权威证书签名机构给你签名这张证书,则需要认真回答下面的问题,我们做自签名,也就是自己给自己压个钢印,所以不需要这么严格了,后面的2个问题就直接回车跳过即可!
A challenge password []:
An optional company name []:
问题回答完毕后,就会生成一个 server110.com.csr文件,这个CSR文件的作用就用于提交给RootCA审核并签发证书的,也就是要给到派出所的警察蜀黍审核的材料,所以回答的各项问题一定要正确和仔细,否则他是不会给你压钢印的;
这里我们就不提交派出所了,直接自己给自己压一个假的钢印好了,只要能加密就行,不考虑权威性,接着往下走;
2,自己给自己签发证书
openssl x509 -req -days 3650 -in server110.com.csr -signkey server110.com.key -out server110.com.crt
-days 3650 证书的有效期,自己给自己颁发证书,想有多久有效期,就弄多久,我一下弄了10年的有效期;
-in server110.com.csr 指定CSR文件
-signkey server110.com.key 指定服务器的私钥key文件
-out server110.com.crt 设置生成好的证书文件名
一条命令,自己给自己压钢印的身份证 server110.com.crt 就诞生了!
注:其实严格来讲,这里生成的只是一张RootCA,并不是严格意义上的服务器证书 ServerCA,真正的ServerCA是需要利用这张RootCA再给服务器签署办法出来的证书才算;不过我们这里只讲如何实现网页的SSL加密,所以就直接使用RootCA了,也是能正常实现加密功能的!
NGINX配置启用HTTPS
key和证书都有了,现在配置Nginx使用这个张证书和KEY对网站进行加密;
https的配置,只需要在 nginx的配置文件后面增加一个 server段的配置即可,内容如下:
# HTTPS server
server {
listen 443; //监听端口443
server_name www.server110.com;
ssl on; //启用SSL加密
ssl_certificate /etc/cert/server110.com.crt; //服务器证书文件
ssl_certificate_key /etc/cert/server110.com.key; //服务器私钥key文件
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; //支持的SSL加密协议版本
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
—————–以下网站内容location部分的配置就和HTTP的部分一样了,可以直接copy过来————
index index.html index.htm index.php;
root /home/moonfly-root;
location / {
………
}
配置文件修改完毕后,用nginx -t 测试下配置无误,就reload一下nginx服务,检查443端口是否在监听:
#/usr/local/nginx/sbin/ngint -t //测试配置文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful //显示表示配置文件没有错误
#service nginx reload //重新加载nginx服务
#netstat -lan | grep 443 //查看443端口
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN //有看到这一行,就表示HTTPS已经在工作了
#
现在已经可以通过HTTPS访问网站了
显示证书详情:
![NGINX启用HTTPS SSL证书详情](http://upload.server110.com/image/20131103/1TK21O9-1.jpg)