最近在研究nginx,整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商那边申请证书又不合算,因为访问服务器的都是内部人士,所以自己给自己颁发证书,忽略掉浏览器的不信任警报即可。下面是颁发证书和配置过程。
首先确保机器上安装了openssl和openssl-devel
#yum install openssl
#yum install openssl-devel
然后就是自己颁发证书给自己
#cd /usr/local/nginx/conf
#openssl genrsa -des3 -out server.key 1024
#openssl req -new -key server.key -out server.csr (证书各个字段介绍见最后)
#openssl rsa -in server.key -out server_nopwd.key
#openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt
至此证书已经生成完毕,下面就是配置nginx
server {
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server_nopwd.key;
}
------
server {
listen 443;
server_name www.test.com;
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server_nopwd.key;
location / {
proxy_pass http://10.100.142.63:8082/;
}
}
server {
listen 80;
server_name www.test.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
------
然后重启nginx即可。
ps: 如果出现“[emerg] 10464#0: unknown directive "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字段名
缩写 说明(我的信息) 填写要求
Country Name C 证书持有者所在国家(CN) *要求填写国家代码,用2个字母表示
State or Province Name ST 证书持有者所在州或省份(zhejiang) 填写全称,可省略不填
Locality Name L 证书持有者所在城市(hangzhou) 可省略不填
Organization Name O 证书持有者所属组织或公司(xxx) *最好还是填一下
Organizational Unit Name OU 证书持有者所属部门(no) 可省略不填
Common Name CN 证书持有者的通用名(XXX.com) *必填。
对于非应用证书,它应该在一定程度上具有惟一性;
对于应用证书,一般填写服务器域名或通配符样式的域名。
Email Address 证书持有者的通信邮箱([email protected]) 可省略不填
注意:证书的详细信息-使用者或颁发者中出现一些明明没有设置过的信息时,请检查openssl.cnf [req_distinguished_name],注释掉*_default的参数.
B.用CA签名认证
1.创建server待签名证书私匙
因为这里只是用于测试,这里选择1024强度.
openssl genrsa -aes128 -out server.key 1024
注意:golang中使用https时需另从密钥对中提取私钥"openssl rsa -in server.key -out server_pri.key.
2. 生成 csr 文件(证书请求文件)
openssl req -new -key server.key -out server.csr
此时,在common name中填入网站域名,如blog.xxx.net即可生成该站点的证书,同时也可以使用泛域名如*.xxx.net来生成所有二级域名可用的网站证书.多域名证书可通过修改openssl.cnf生成.
其他说明:"Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #加密证书请求的密码,证书请求需要在网络上传递,所以加密防止别人窥探,一般不用填
An optional company name []: #不清楚,不用填
"时,
=========================================
概念:
1. 数字证书认证机构(英语:Certificate Authority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构或证书授权中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
2. CSR是Cerificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
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.key CA私钥:
openssl genrsa -des3 -out ca.key 2048
ca.key是密钥文件名,是生成的rsa私钥,des3算法,openssl格式,2048位强度;-out指定生成文件的文件名。
注意:这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的2048是生成密钥的长度。
为了生成这样的密钥,默认中间需要输入一个密码(适用于有安全需求的场合)。可以通过以下方法生成没有密码的key(其实就是从密钥对中提取了私钥,一般无此必要):
openssl rsa -in ca.key -out ca.key ##此时生成的ca.key没有密码
2.用CA私钥进行自签名,得到自签名的CA根证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt ##这里及下面的ca.key均带密码
注意:碰到"Unable to load config info from /usr/local/ssl/openssl.cnf"时,请下载一个可用的openssl.cnf,并追加参数"-config openssl.cnf路径"即可.
"req":openssl子命令,用于生成证书;"-new":生成新的证书请求;"-days 365":从生成之时算起,证书时效为365天(仅当使用-x509选项后有效);"-x509":生成自签名证书,没有该项时表示生成csr.
生成证书时,需输入识别证书持有者身份的信息,下表是关于它们的缩写、说明和一些填写说明。【此部分参考了互动百科的SSL条目】(带"*"重要,必填)
DN字段名
缩写 说明(我的信息) 填写要求
Country Name C 证书持有者所在国家(CN) *要求填写国家代码,用2个字母表示
State or Province Name ST 证书持有者所在州或省份(zhejiang) 填写全称,可省略不填
Locality Name L 证书持有者所在城市(hangzhou) 可省略不填
Organization Name O 证书持有者所属组织或公司(xxx) *最好还是填一下
Organizational Unit Name OU 证书持有者所属部门(no) 可省略不填
Common Name CN 证书持有者的通用名(XXX.com) *必填。
对于非应用证书,它应该在一定程度上具有惟一性;
对于应用证书,一般填写服务器域名或通配符样式的域名。
Email Address 证书持有者的通信邮箱([email protected]) 可省略不填
注意:证书的详细信息-使用者或颁发者中出现一些明明没有设置过的信息时,请检查openssl.cnf [req_distinguished_name],注释掉*_default的参数.
B.用CA签名认证
1.创建server待签名证书私匙
因为这里只是用于测试,这里选择1024强度.
openssl genrsa -aes128 -out server.key 1024
注意:golang中使用https时需另从密钥对中提取私钥"openssl rsa -in server.key -out server_pri.key.
2. 生成 csr 文件(证书请求文件)
openssl req -new -key server.key -out server.csr
此时,在common name中填入网站域名,如blog.xxx.net即可生成该站点的证书,同时也可以使用泛域名如*.xxx.net来生成所有二级域名可用的网站证书.多域名证书可通过修改openssl.cnf生成.
其他说明:"Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #加密证书请求的密码,证书请求需要在网络上传递,所以加密防止别人窥探,一般不用填
An optional company name []: #不清楚,不用填
"时,
3.为 csr 文件签名,生成证书
openssl ca -policy policy_anything -days 365 -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
参数说明:
ca //使用openssl的ca子命令
-in server.csr //指定待签发证书的 CSR文件为 server.csr
-out server.crt //指定输出所签发证书的信息到文件,且文件名为server.crt
-cert ca.crt //指定为证书签名的CA的公钥证书为ca.crt【用到CA证书的持有者信息】
-keyfile ca.key //指定为证书签名的CA的私钥文件为ca.key【用CA私钥实际执行签名】
-days 365 //指定所签发证书的有效期为365天(1年),不允许超过ca.crt的有效期
-policy policy_anything //指定签发策略为 policy_anything 【即,允许所签发证书的持有者信息和颁发者信息之间不遵守任何匹配策略】
-md //指定签名哈希算法[默认是openssl.cnf中的default_md]
如果ca.key没有密码,以上命令后输入两次”y”,即可生成server.crt.
错误:
1."“I am unable to access the..."
按照openssl.cnf里的[CA_default]定义
mkdir -p demoCA/newcerts
touch ./demoCA/index.txt
echo "01" > demoCA/serial #颁发证书时使用的序列号,使用后会递增.重置serial时,需清空newcerts文件夹和index.txt
C. 导入证书
将ca.crt导入自己的操作系统即可(证书[未导入前]上有提示导入到哪个项目下).
ps:
Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员宣布了 Let’s Encrypt CA项目,计划为网站提供免费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