使用nginx搭建https服务器
源:http://www.cnblogs.com/tintin1926/archive/2012/07/12/2587311.html
http://my.oschina.net/meilihao/blog/337087
评:
最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商那边申请证书又不合算,因为访问服务器的都是内部人士,所以自己给自己颁发证书,忽略掉浏览器的不信任警报即可。下面是颁发证书和配置过程。
首先确保机器上安装了openssl和openssl-devel
#yuminstallopenssl
#yuminstallopenssl-devel
然后就是自己颁发证书给自己
#cd/usr/local/nginx/conf
#opensslgenrsa-des3-outserver.key1024
#opensslreq-new-keyserver.key-outserver.csr(证书各个字段介绍见最后)
#opensslrsa-inserver.key-outserver_nopwd.key
#opensslx509-req-days365-inserver.csr-signkeyserver_nopwd.key-outserver.crt
至此证书已经生成完毕,下面就是配置nginx
server{
listen443;
sslon;
ssl_certificate/usr/local/nginx/conf/server.crt;
ssl_certificate_key/usr/local/nginx/conf/server_nopwd.key;
}
------
server{
listen443;
server_namewww.test.com;
sslon;
ssl_certificate/etc/nginx/ssl/server.crt;
ssl_certificate_key/etc/nginx/ssl/server_nopwd.key;
location/{
proxy_passhttp://10.100.142.63:8082/;
}
}
server{
listen80;
server_namewww.test.com;
rewrite^(.*)$https://$host$1permanent;
}
------
然后重启nginx即可。
ps:如果出现“[emerg]10464#0:unknowndirective"ssl"in/usr/local/nginx-0.6.32/conf/nginx.conf:74”则说明没有将ssl模块编译进nginx,在configure的时候加上“--with-http_ssl_module”即可^^
至此已经完成了https服务器搭建,但如何让浏览器信任自己颁发的证书呢?
今天终于研究捣鼓出来了,只要将之前生成的server.crt文件导入到系统的证书管理器就行了,具体方法:
控制面板->Internet选项->内容->发行者->受信任的根证书颁发机构->导入-》选择server.crt
===================================生成签名字段说明======
生成证书时,需输入识别证书持有者身份的信息,下表是关于它们的缩写、说明和一些填写说明。【此部分参考了互动百科的SSL条目】(带"*"重要,必填)
DN字段名
缩写说明(我的信息)填写要求
CountryNameC证书持有者所在国家(CN)*要求填写国家代码,用2个字母表示
StateorProvinceNameST证书持有者所在州或省份(zhejiang)填写全称,可省略不填
LocalityNameL证书持有者所在城市(hangzhou)可省略不填
OrganizationNameO证书持有者所属组织或公司(xxx)*最好还是填一下
OrganizationalUnitNameOU证书持有者所属部门(no)可省略不填
CommonNameCN证书持有者的通用名(XXX.com)*必填。
对于非应用证书,它应该在一定程度上具有惟一性;
对于应用证书,一般填写服务器域名或通配符样式的域名。
EmailAddress证书持有者的通信邮箱([email protected])可省略不填
注意:证书的详细信息-使用者或颁发者中出现一些明明没有设置过的信息时,请检查openssl.cnf[req_distinguished_name],注释掉*_default的参数.
B.用CA签名认证
1.创建server待签名证书私匙
因为这里只是用于测试,这里选择1024强度.
?
1
opensslgenrsa-aes128-outserver.key1024
注意:golang中使用https时需另从密钥对中提取私钥"opensslrsa-inserver.key-outserver_pri.key.
2.生成csr文件(证书请求文件)
?
1
opensslreq-new-keyserver.key-outserver.csr
此时,在commonname中填入网站域名,如blog.xxx.net即可生成该站点的证书,同时也可以使用泛域名如*.xxx.net来生成所有二级域名可用的网站证书.多域名证书可通过修改openssl.cnf生成.
其他说明:"Pleaseenterthefollowing'extra'attributes
tobesentwithyourcertificaterequest
Achallengepassword[]:#加密证书请求的密码,证书请求需要在网络上传递,所以加密防止别人窥探,一般不用填
Anoptionalcompanyname[]:#不清楚,不用填
"时,
=========================================
概念:
1.数字证书认证机构(英语:CertificateAuthority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构或证书授权中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
2.CSR是CerificateSigningRequest的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
参考:http://blog.csdn.net/howeverpf/article/details/21622545
http://www.cnblogs.com/littlehann/p/3738141.html
SSL生成证书流程
server生成私钥server.key-->生成csr->+(ca.key+ca.crt)->生成证书server.crt
/
CA导出私钥(ca.key)和证书(ca.crt)
\
client生成私钥client.cky-->生成csr->+(ca.key+ca.crt)->生成证书client.crt
步骤:
A.制作CA证书
1.制作ca.keyCA私钥:
?
1
opensslgenrsa-des3-outca.key2048
ca.key是密钥文件名,是生成的rsa私钥,des3算法,openssl格式,2048位强度;-out指定生成文件的文件名。
注意:这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的2048是生成密钥的长度。
为了生成这样的密钥,默认中间需要输入一个密码(适用于有安全需求的场合)。可以通过以下方法生成没有密码的key(其实就是从密钥对中提取了私钥,一般无此必要):
?
1
opensslrsa-inca.key-outca.key##此时生成的ca.key没有密码
2.用CA私钥进行自签名,得到自签名的CA根证书
?
1
opensslreq-new-x509-days365-keyca.key-outca.crt##这里及下面的ca.key均带密码
注意:碰到"Unabletoloadconfiginfofrom/usr/local/ssl/openssl.cnf"时,请下载一个可用的openssl.cnf,并追加参数"-configopenssl.cnf路径"即可.
"req":openssl子命令,用于生成证书;"-new":生成新的证书请求;"-days365":从生成之时算起,证书时效为365天(仅当使用-x509选项后有效);"-x509":生成自签名证书,没有该项时表示生成csr.
生成证书时,需输入识别证书持有者身份的信息,下表是关于它们的缩写、说明和一些填写说明。【此部分参考了互动百科的SSL条目】(带"*"重要,必填)
DN字段名
缩写说明(我的信息)填写要求
CountryNameC证书持有者所在国家(CN)*要求填写国家代码,用2个字母表示
StateorProvinceNameST证书持有者所在州或省份(zhejiang)填写全称,可省略不填
LocalityNameL证书持有者所在城市(hangzhou)可省略不填
OrganizationNameO证书持有者所属组织或公司(xxx)*最好还是填一下
OrganizationalUnitNameOU证书持有者所属部门(no)可省略不填
CommonNameCN证书持有者的通用名(XXX.com)*必填。
对于非应用证书,它应该在一定程度上具有惟一性;
对于应用证书,一般填写服务器域名或通配符样式的域名。
EmailAddress证书持有者的通信邮箱([email protected])可省略不填
注意:证书的详细信息-使用者或颁发者中出现一些明明没有设置过的信息时,请检查openssl.cnf[req_distinguished_name],注释掉*_default的参数.
B.用CA签名认证
1.创建server待签名证书私匙
因为这里只是用于测试,这里选择1024强度.
?
1
opensslgenrsa-aes128-outserver.key1024
注意:golang中使用https时需另从密钥对中提取私钥"opensslrsa-inserver.key-outserver_pri.key.
2.生成csr文件(证书请求文件)
?
1
opensslreq-new-keyserver.key-outserver.csr
此时,在commonname中填入网站域名,如blog.xxx.net即可生成该站点的证书,同时也可以使用泛域名如*.xxx.net来生成所有二级域名可用的网站证书.多域名证书可通过修改openssl.cnf生成.
其他说明:"Pleaseenterthefollowing'extra'attributes
tobesentwithyourcertificaterequest
Achallengepassword[]:#加密证书请求的密码,证书请求需要在网络上传递,所以加密防止别人窥探,一般不用填
Anoptionalcompanyname[]:#不清楚,不用填
"时,
3.为csr文件签名,生成证书
?
1
opensslca-policypolicy_anything-days365-certca.crt-keyfileca.key-inserver.csr-outserver.crt
参数说明:
?
1
2
3
4
5
6
7
8
ca//使用openssl的ca子命令
-inserver.csr//指定待签发证书的CSR文件为server.csr
-outserver.crt//指定输出所签发证书的信息到文件,且文件名为server.crt
-certca.crt//指定为证书签名的CA的公钥证书为ca.crt【用到CA证书的持有者信息】
-keyfileca.key//指定为证书签名的CA的私钥文件为ca.key【用CA私钥实际执行签名】
-days365//指定所签发证书的有效期为365天(1年),不允许超过ca.crt的有效期
-policypolicy_anything//指定签发策略为policy_anything【即,允许所签发证书的持有者信息和颁发者信息之间不遵守任何匹配策略】
-md//指定签名哈希算法[默认是openssl.cnf中的default_md]
如果ca.key没有密码,以上命令后输入两次”y”,即可生成server.crt.
错误:
1."“Iamunabletoaccessthe..."
按照openssl.cnf里的[CA_default]定义
?
1
2
3
mkdir-pdemoCA/newcerts
touch./demoCA/index.txt
echo"01">demoCA/serial#颁发证书时使用的序列号,使用后会递增.重置serial时,需清空newcerts文件夹和index.txt
C.导入证书
将ca.crt导入自己的操作系统即可(证书[未导入前]上有提示导入到哪个项目下).
ps:
Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员宣布了Let’sEncryptCA项目,计划为网站提供免费SSL证书,加速将Web从HTTP过渡到HTTPS(从2015夏开始,详细:http://linux.cn/article-4254-1.html).
SSL证书详解--数字签名和数字证书http://www.livyfeel.com/ssl/
其他参考:https://linux.cn/article-5443-1.html