Ubuntu 18.04使用OpenSSL自签证书(证书支持多IP及多域名,谷歌浏览器无警告)
前言
在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,以保证网络传输过程中数据的机密性。HTTPS协议可以大致分为两个部分:其一是协商密钥,首先当Client向Web Server发起请求时,Web Server向Client返回一个包含Server端公钥的证书,然后Client验证该证书的合法性并生成一个随机密钥,接着使用该证书对生成的随机密钥进行非对称加密后发送回Web Server,最后Web Server使用私钥进行解密后获取Client生成的随机密钥;其二是加密通信,Web Server与Client端采用随机密钥进行对称加解密进行通信。HTTPS通信流程图如下,引用于Leon_hy的博客。证书一般由第三方CA进行签发,自签证书将不被浏览器信任,会弹出连接不安全的小窗。本文介绍了Ubuntu 18.04使用OpenSSL自建CA且签发证书的流程,并成功获取谷歌等浏览器的信任。
环境准备
1. OpenSSL依赖安装
$ sudo apt-get install -y openssl libssl-dev
2. 创建证书保存目录及相关文件
需要注意的是,以下除了certificate文件夹外,命名必须与/usr/local/ssl/openssl.cnf中的对应名称保持一致,以下均采用默认值
$ cd ~ $ mkdir certificate && cd certificate $ mkdir demoCA && cd demoCA $ mkdir private newcerts $ touch index.txt $ echo '01' > serial
自建CA
1. 生成根密钥
需要注意的是,此处的密钥名必须与/usr/local/ssl/openssl.cnf中的名称保持一致,默认为cakey.pem
$ cd private $ openssl genrsa -out cakey.pem 2048
2. 生成根CA证书
$ openssl req -new -x509 -days 3650 -key cakey.pem -out cacert.pem
随后按照指引填写根CA证书的相关信息,其中填写内容不做要求(特别指出Common Name此处为根证书颁发机构,命名建议为XX Root CA)
3. 将根证书移动到demoCA文件夹下
$ cd .. && mv ./private/cacert.pem ./
添加信任
下面介绍两种证书验证场景下,添加信任的方式
1. Google浏览器(火狐浏览器类似)
设置->隐私设置和安全性->管理证书->导入->下一步->浏览
注意此处谷歌浏览器默认导入证书后缀为crt,可以选择所有文件后导入cacert.pem文件到受信任的根证书颁发机构并确认
2. OpenSSL默认证书验证文件(调用OpenSSL库验证证书合法性的应用将使用该文件如curl等,注意在Ubuntu其他版本中ca-certificates.crt文件可能又叫做ca-bundle.crt)
$ sudo sh -c "cat cacert.pem >> /etc/ssl/certs/ca-certificates.crt"
颁发证书
1. 切换出demoCA文件夹,到certificate文件夹
$ cd ~/certificate
2. 创建custom.ext文件,添加多IP配置,文件内容如下(如果需要配置多DNS域名解析,可以在[ SubjectAlternativeName ]下添加DNS.1 = www.XXX.com或者正则匹配式*.XXX.com)
3. 创建私钥
$ openssl genrsa -out custom.key 2048
4. 创建证书请求文件
$ openssl req -new -key custom.key -out custom.csr
随后按照指引填写证书的相关信息,填写内容除了Common Name,其余部分尽量与根证书保持一致(Common Name内容不做要求)
5. 签发证书
$ openssl ca -in custom.csr -extfile custom.ext -days 365 -out custom.crt
签发后的证书连同私钥可以供Web Server使用
测试
1. google浏览器测试结果
2. 火狐浏览器测试结果