下载cfssl
https://github.com/cloudflare/cfssl
HTTPS验证证书
CA根证书
- CA机构的证书,用来签署其他企业的证书
server-key.pem
-
服务端生成的私钥文件
-
可以解密客户端发送加密数据(https握手过程交换秘钥)
server.csr
-
csr文件为证书请求文件
-
包含企业等信息,非对称加密等选项
server.pem
-
证书文件
-
使用server.csr通过CA证书签名(sha256,md5)过的证书文件
创建CA根证书
ca-config.json
- 这个是给其他的请求文件的签名配置
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"ssl.sentiger.com": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
-
signing:签署配置
-
default:默认的配置
-
default.expiry:默认签署其他证书过期时间
-
profiles:配置文件,可以配置多个不同的证书配置
-
ssl.sentiger.com:定义的一个profile,可以使用命令生成这个的证书
-
usages
ca-csr.json
-
CA的证书请求文件配置,用来生成证书
-
可以安装到客户端本地,来验证CA机构
{
"CN": "sentiger company name",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "nginx",
"OU": "System"
}
]
}
一般的数字证书产品的主题通常含有如下字段:
CN
CN: 公用名称 (Common Name) 简称,对于 SSL 证书,一般为网站域名或IP地址;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名;
names 字段
- 单位名称 (Organization Name) :简称:O 字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称;
证书申请单位所在地:
-
所在城市 (Locality) 简称:L 字段
-
所在省份 (State/Provice) 简称:S 字段
-
所在国家 (Country) 简称:C 字段,只能是国家字母缩写,如中国:CN
其他一些字段:
-
电子邮件 (Email) 简称:E 字段
-
多个姓名字段 简称:G 字段
-
介绍:Description 字段
-
电话号码:Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888
-
地址:STREET 字段
-
邮政编码:PostalCode 字段
-
显示其他内容 简称:OU 字段
生成CA相关文件
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
-
ca.csr:这个是用来生成ca.pem,这个其实没有用了
-
ca-key.pem:CA私钥文件
-
ca.pem:CA证书文件
服务器证书
server-csr.json
{
"CN": "*.sentiger.com",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
注意:
CN: "Common Name,填写自己的域名,否则curl请求会判断域名和当前域名不一致,这里写了通用域名"
-
服务器的证书请求配置
-
生成server-csr.csr
命令生成
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=ssl.sentiger.com server-csr.json | cfssljson -bare server
-
server.pem:服务器证书文件(ssl握手会下载这个证书)
-
server-key.pem:私钥文件
客户端证书
{
"CN": "ssl.sentiger.com",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
nginx配置
双向认证
server {
listen 443 ssl;
server_name ssl.sentiger.com;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
root /nginx/html;
# 服务器公钥
ssl_certificate /etc/nginx/ssl/ssl.sentiger.com/server.pem;
# 服务器私钥
ssl_certificate_key /etc/nginx/ssl/ssl.sentiger.com/server-key.pem;
# CA机构证书 验证客户端证书是否是同一CA签发
ssl_client_certificate /etc/nginx/ssl/ssl.sentiger.com/ca.pem;
# on 打开双向认证
ssl_verify_client on;
ent_certificate /etc/nginx/ssl/ssl.sentiger.com/ca.pem;
# on 打开双向认证
ssl_verify_client on;
}
curl测试
curl --cacert /etc/nginx/ssl/ssl.sentiger.com/ca.pem --key /etc/nginx/ssl/ssl.sentiger.com/client-key.pem --cert /etc/nginx/ssl/ssl.sentiger.com/client.pem https://ssl.sentiger.com
--cacert CA证书,因为自己制作CA机构,本地服务器不认,所以制定CA机构,或者 --insecure或略CA机构的认证
--key 客户私钥
--cert 客户端的证书文件
测试
-
证书不安全
-
因为这是我们自己签发的证书,本地还没有
Mac下将自签CA证书安装本地
-
下载ca.pem证书文件到本地
-
打开本地秘钥管理,导入
- 重启浏览器测试
-
测试查看证书是有效的
-
但是浏览器还是认为你这个不是正规机构颁布的,不安全