一、概念介绍
1)传输协议
HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的。也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输的数据流。但是有时候,我们需要在网络上传输一些安全性或者私秘性的数据,譬如:包含信用卡及商品信息的电子订单。这个时候,如果仍然使用HTTP协议,势必会面临非常大的风险!相信没有人能接受自己的信用卡号在互联网上裸奔。
HTTPS(超文本传输安全)协议无疑可以有效的解决这一问题。所谓HTTPS,其实就是HTTP和SSL/TLS的组合,用以提供加密通讯及对网络服务器的身份鉴定。HTTPS的主要思想是在不安全的网络上创建一安全信道,防止黑客的窃听和攻击。
SSL(安全套接层)可以用来对Web服务器和客户端之间的数据流进行加密。
SSL利用非对称密码技术进行数据加密。加密过程中使用到两个秘钥:一个公钥和一个与之对应的私钥。使用公钥加密的数据,只能用与之对应的私钥解密;而使用私钥加密的数据,也只能用与之对应的公钥解密。因此,如果在网络上传输的消息或数据流是被服务器的私钥加密的,则只能使用与其对应的公钥解密,从而可以保证客户端与与服务器之间的数据安全。
2)数字证书
所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示CA结构对证书持有者的认可。数字证书拥有以下几个优点:
使用数字证书能够提高用户的可信度
数字证书中的公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上
X.509证书包含三个文件:key,csr,crt。
key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。
3)自签证书的区别
自签名私有证书VS私又CA自签名证书
自签名证书分为自签名私有证书和自签名CA证书两种,区别是私有证书无法被吊销,自签的CA证书可以被吊销。能不能吊销证书的区别我理解是CA证书有一套证书吊销机制,可以决定什么情况吊销证书,而私有证书没有这种安全机制(数据完整性,过期时间之类的吧),对于被劫持的风险更高(参考资料)(使用自签的系统有几个是重要的,况且即便是自签的证书也会被浏览器提示未认证的签名机构,不过有的浏览器可能对于私有证书这种认证会直接拒绝连提示的机会都不给)
再一个区别就是需要创建多个客户端证书的时候,推荐使用CA证书,因为只要给所有的客户端(有待推敲)都安装了 CA 根证书,那么以该 CA 根证书签名过的客户端证书都是信任的,不需要重复的安装客户端证书。
申请权威机构的CA证书VS自签名CA证书
1、权威CA机构申请的证书要花银子,自签证书不要银子
2、自签证书会出现google浏览器不认的情况,比较麻烦。漏洞也多,对安全不利。
3、使用机构签发的证书时候需要联网签发,内网机器不用想
所以公网服务踏实的买证书,内网机器踏实的自签证书。
4)证书类型
x509的证书编码格式有两种
1.PEM(Privacy-enhanced Electronic Mail) 是明文格式的 以 -----BEGIN CERTIFICATE-----开头,已-----END CERTIFICATE-----结尾,中间是经过base64编码的内容,apache需要的证书就是这类编码的证书 查看这类证书的信息的命令为 :openssl x509 -noout -text -in server.pem
其实PEM就是把DER的内容进行了一次base64编码
2.DER 是二进制格式的证书 查看这类证书的信息的命令为 :openssl x509 -noout -text -inform der -in server.der
扩展名:
.crt 证书文件 ,可以是DER(二进制)编码的,也可以是PEM( ASCII (Base64) )编码的 ,在类unix系统中比较常见
.cer 也是证书 常见于Windows系统 编码类型同样可以是DER或者PEM的,windows 下有工具可以转换crt到cer
.csr 证书签名请求 一般是生成请求以后发送给CA,然后CA会给你签名并发回证书
.key 一般公钥或者密钥都会用这种扩展名,可以是DER编码的或者是PEM编码的 查看DER编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform DER -noout -text -in xxx.key 查看PEM编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform PEM -noout -text -in xxx.key
.p12 证书 包含一个X509证书和一个被密码保护的私钥
二、制作自签证书
1)自签私有证书
1.生成证书私钥(Key)
openssl genrsa -des3 -out server.key 2048
生成rsa私钥,des3算法,2048位强度,server.key是秘钥文件名。生成私钥的时候会要求提供一个至少4位数的序列号就当是密码吧。
2.生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr
此时可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书。还有就是自建一个私有CA做认证。再者就是用OpenSSL实现自签名,私有认证。
生成 CSR 的过程中,会提示输入一些信息,包括:序列号、公钥、用户名称、签发者、CA签名和其他一些附属信息等。
证书验证过程就是依赖于这信息和公钥对应的私钥进行。
其中一个提示是 Common Name (e.g. YOUR name),这个非常重要,这一项应填入 FQDN(Fully Qualified Domain Name)完全合格域名/全称域名,
如果您使用 SSL 加密保护网络服务器和客户端之间的数据流,举例被保护的网站是 https://test.example.cn,那么此处 Common Name 应输入 test.example.cn
3.删除私钥中的密码
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
4.生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
5、安装私钥和证书
将私钥和证书文件复制到Apache的配置目录下即可。
以上1-4步也可以使用一条命令执行完成:
openssl req -new -x509 -newkey rsa:2048 -keyout /root/ca/server.key -out /root/ca/server.crt
2)私有CA认证
私有CA就是自己创建一个CA根证书代替权威CA机构,然后用私有的根证书签发客户端证书
创建CA根证书
centos默认安装了openssl,看一下目录
/etc/pki/CA /etc/pki/tls
/etc/pki/CA/
newcerts 存放CA签署(颁发)过的数字证书(证书备份目录)
private 用于存放CA的私钥
crl 吊销的证书
/etc/pki/tls/
cert.pem 软链接到certs/ca-bundle.crt
certs/ 该服务器上的证书存放目录,可以放自己的证书和内置证书
ca-bundle.crt 内置信任的证书
private 证书密钥存放目录
openssl.cnf openssl的CA主配置文件
openssl的配置文件为openssl.cnf,一般存储在/etc/pki/tls/目录下。一定要注意配置文件中 [ policy_match ]标签下设定的匹配规则。有可能因为证书使用的工具不一样,导致即使设置了csr中看起来有相同的countryName,stateOrProvinceName等,但在最终生成证书时依然报错。一般情况下,配置文件不需要改动。
生成根证书
1.生成根证书密钥
cd /etc/pki/CA/
openssl genrsa -out ./private/ca.key 2048
2.生成根证书请求
openssl req -new -in ./private/ca.key -out ca.csr
3.生成根证书
openssl x509 -req -in ca.csr -signkey ./private/ca.key -extensions v3_ca -out ca.crt
签发证书
我们可以用CA根证书签发证书,也可以创建中间CA,使用中间CA签发证书。创建中间CA的好处是即使中间CA的私钥泄露,造成的影响也是可控的,我们只需要使用root CA撤销对应中间CA的证书即可。此外root CA的私钥可以脱机妥善保存,只需要在撤销和更新中间CA证书时才会使用。基于根证书创建中间CA与创建根证书过程类似。我们新建一个目录用于保存中间证书信息
创建中间证书(可以不做)
#准备环境
mkdir /etc/pki/CA/intermediate
cd /etc/pki/CA/intermediate
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
#生成密钥
cd /etc/pki/CA
openssl genrsa -aes256 -out intermediate/private/ca.key 2048
#新建请求
openssl req -config intermediate_CA.cnf -sha256 -new -key intermediate/private/ca.key -out intermediate/certs/ca.csr
#签发中间CA证书
openssl ca -config root_CA.cnf -extensions v3_ca -notext -md sha256 -in intermediate/certs/ca.csr -out intermediate/certs/ca.cert
利用根证书或者中间证书签发客户端证书的步骤如下:
mkdir -p /root/ca
1.新建证书密钥
openssl genrsa -out /root/ca/server.key 2048
2.新建证书请求
注意要和刚才ca证书申请的,信息一致
openssl req -new -in /root/ca/server.key -out /root/ca/server.csr
3.CA签发证书
openssl x509 -req -in /root/ca/server.csr -CA /etc/pki/CA/ca.crt -CAkey /etc/pki/CA/private/ca.key -CAcreateserial -out /root/ca/server.crt
4.证书有效性验证
openssl verify -CAfile /etc/pki/CA/ca.crt /root/ca/server.crt
5.不同客户端证书格式转换
#crt,pem格式证书可用于linux/nginx/node.js格式客户端
#p12(pkcs12)格式证书用于tomcat/java/android客户端
#打包为p12证书
openssl pkcs12 -export -in /root/ca/server.crt -inkey /root/ca/server.key -out /root/ca/server.p12
6.吊销证书
#获取要吊销的证书的serial
openssl x509 -in /root/ca/server.crt -noout -serial -subject
#对比serial与subject 信息是否与index.txt中的信息一致
#如果一致,则可以吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
#如果是第一次吊销证书,需要指定吊销的证书编号
echo 01 >/etc/pki/CA/crlnumber
#更新吊销证书列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
#完成后,可查看吊销的证书列表
openssl crl -in /etc/pki/CA/crl.pem -noout -text
三、使用
play
1、在项目里新建一个文件夹
2、将刚才签好客户端证书server.crt、server.key放到这里
3、打开配置文件conf/application.conf
4、添加以下三行
https.port=8000
certificate.key.file= 不要使用绝对路径
certificate.file=
5、重启项目 play restart
harbor
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=testca.com
DNS.2=web
EOF
subj = /C=ch/ST=State or Province Name/L=beijing/O=jss/OU=jss/CN=yqpt2.com/emailAddress=testemail@qq.com 样例
1. mdkir -p /root/ca;cd /root/ca 放到一个目录里也可以,最后再把ca放到private里,方便管理
根CA
2. openssl genrsa -out ca.key 4096
3. openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mydomain.com" -key ca.key -out ca.crt
签发客户端证书
5. openssl genrsa -out mydomain.com.key 4096
6. openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mydomain.com" -key mydomain.com.key -out mydomain.com.csr
7. openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in mydomain.com.csr -out mydomain.com.crt
验证证书
8. openssl verify -CAfile ca.crt mydomain.com.crt