公司最近需要在搭建一套面向国外访问群体的网站,也是碰了一鼻子灰,主要是ssl证书申请,这里记录一下
1. 网站开发
这里就举一个简单例子,只有一个index.html
<!DOCTYPE html>
<html>
<body>
<h1>欢饮来到CSDN空间</h1>
</body>
</html>
2. 域名购买及ssl证书验证
域名购买可以在阿里云、腾讯云、namecheap、Let's Encrypt等操作。阿里云稍微简单些,按照官网说明一步一步走下去即可,这里主要说明namecheap的操作:
首先本地使用openssl工具生成自己的私钥(.key文件)和证书签名请求(.csr文件),根据namecheap官方文档验证的csr文件是2048位,所以在生成私钥时选择2048位。操作步骤如下:
* 生成私钥: openssl genrsa -des3 -out server.key 2048
* 生成证书签名请求:openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
> Country Name (2 letter code) [xx]: CN # 国家
> State or Province Name (full name)[]: SH # 省份
> Locality Name(eg,city)[Default City]: SH # 城市
> Organization Name(eg,company)[Default Company Ltd]: # 组织, 随便填写eg:ethdao
> Common Name(eg,your name or your server's hostname)[]: # 域名, 这个必须和你购买的域名保持一致eg: ethdao.io
> Email Address[]: # 邮箱, 后面验证需要用到
> A chanllenge password[]: # 密码
> An optional company name[]: # 公司名称,可选
这两部完了之后就可以在当前目录下存在两个文件,server.key和server.csr。如果嫌麻烦或者openssl工具没安装的,可以在网上生成,比如:https://decoder.link/csr_generator 和 https://www.chinassl.net/ssltools/generator-csr.html,填写完信息后直接点解生成即可产生这两个文件,然后拷贝这两个文件数据到本地。
* 映射域名
将新买域名(eg: ethdao.io)使用A记录方式映射到服务器IP地址(部署网站的服务器)
* 激活证书
这里激活方式有三种:邮件验证、http-验证、dns-验证,这里尝试了邮件验证和dns验证,都因为邮箱收不到验证信息,所以后面选在http-s验证方式,后面也是针对这种方式进行操作。
> 选择http-base Validation,下载验证文件eg: 2E9A218011234567890BFA.txt
> 将文件放到网站工程首页目录下.well-known/pki-validation/, 从浏览器可以直接访问到该文件url:http://ethdao.io/.well-known/pki-validation/2E9A218011234567890BFA.txt 即可。
> (这里需要注意通过域名访问.well-known目录一致显示404错误,后面域名改成具体的ip地址后才访问,如果遇到同样的问题,可以试一下这种方式)
> 验证通过后,即可完成证书激活,然后会选择收取证书文件的方式,这里选择的邮箱。点击完成,从邮箱下载证书
> 证书文件包括:
__ethdao_io.ca-bundle
__ethdao_io.crt
__ethdao_io.p7
3 合并证书并部署
要使用这书还需要讲.ca-bundle和.crt文件合并,这里使用命令cat *.ca-bundle >> *.crt, 然后将.crt文件和.key文件部署到服务器上即可,具体方式可以自行百度,网上资料也很多。
4. 注意事项
若在部署完后重启nginx时出现如下错误:
nginx: [emerg] PEM_read_bio_X509_AUX("/root/ssl/__ethdao.crt") failed (SSL: error:0906D066:PEM routines:PEM_read_bio:bad end line),
那是因为证书文件合并时未换行导致的,打开.crt文件
将
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
改为:
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
5. 文件说明
> .key是私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
> .csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
> .crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
6. 另附自签名证书制作
{
1. 生成服务端私钥
openssl genrsa -out server.key 1024
2. 生成服务端公钥
openssl rsa -in server.key -pubout -out server.pem
3. 生成客户端私钥
openssl genrsa -out client.key 1024
4. 生成客户端公钥
openssl rsa -in client.key -pubout -out client.pem
5. 生成CA私钥
openssl genrsa -out ca.key 1024
6. # X.509 Certificate Signing Request (CSR) Management.
openssl req -new -key ca.key -out ca.csr
7. # X.509 Certificate Data Management.
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
8. 创建服务端csr文件
openssl req -new -key server.key -out server.csr
9. 向自己CA机构申请证书,签名过程需要CA的证书和私钥参与,最终颁发一个带CA的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
10. 导出pfx文件(该文件可用于https服务程序)
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
11. 创建客户端csr文件
openssl req -new -key client.key -out client.csr
12. 颁发客户单CA证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
13. 导出pfx文件(该文件可用于https服务程序)
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
}