证书服务(三)生成带有SAN扩展的证书
四:openssl生成证书
1.模拟CA
1.1.生成CA根证书私钥,根据你实际需要去生成
有密码:openssl genrsa -des3 -out rootCA.key 4096
无密码:openssl genrsa -out rootCA.key 4096
1.2.生成根证书签名请求文件
openssl req -new -key rootCA.key -out rootCA.csr
1.3.生成CA自签证书
可以用key生成:openssl req -new -x509 -key rootCA.key -out rootCA.crt -days 3650
也可以用csr文件:openssl req -new -x509 -key rootCA.csr -out rootCA.crt -days 3650
1.4.如果1.1生成了有密码的私钥,也有办法去掉key密码
openssl rsa -in rootCA.key -out rootCA_unpass.key.unsecure
1.5如果想自动化输入证书信息,可以用-subj
openssl req -new -key rootCA.key -out rootCA.csr -subj "/C=CN/ST=HeNan/L=ZhengZhou/O=JACKADAM/OU=jack/CN=ca.jackadam.ml/emailAddress=jackadam@sina.com"
openssl req -new -x509 -key rootCA.key -out rootCA.crt -days 3650 -subj "/C=CN/ST=HeNan/L=ZhengZhou/O=JACKADAM/OU=jack/CN=ca.jackadam.ml/emailAddress=jackadam@sina.com"
2.生成服务器证书
2.1生成服务器私钥
openssl genrsa -out server.key 4096
2.2生成服务器签名请求
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=HeNan/L=ZhengZhou/O=JACKADAM/OU=jack/CN=server.jackadam.ml/emailAddress=jackadam@sina.com"
2.3用CA签名
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 3650
3.生成客户端证书
3.1生成服务器私钥
openssl genrsa -out client.key 4096
3.2生成服务器签名请求
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=HeNan/L=ZhengZhou/O=JACKADAM/OU=jack/CN=client.jackadam.ml/emailAddress=jackadam@sina.com"
3.3用CA签名
openssl x509 -req -in client.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out client.crt -days 3650
4.查看证书
五:NGINX配置证书
1.docker运行nginx
docker-compose:
version: '3.5' services: nginx: image: nginx container_name: nginx restart: always ports: - "80:80" - "443:443" volumes: - ./templates:/etc/nginx/templates - ./cert:/etc/nginx/cert privileged: true network_mode: "bridge" environment: - NGINX_HOST=server.jackadam.ml - NGINX_PORT=80
./templates/example.conf.template
server { # 服务器端口使用443,开启ssl, 这里ssl就是上面安装的ssl模块 listen 443 ssl; # 域名,多个以空格分开 server_name server.jackadam.ml; # ssl证书地址 ssl_certificate /etc/nginx/cert/server.crt; # pem文件的路径 ssl_certificate_key /etc/nginx/cert/server.key; # key文件的路径 # ssl验证相关配置 ssl_session_timeout 5m; #缓存有效期 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #安全链接可选的加密协议 ssl_prefer_server_ciphers on; #使用服务器端的首选算法 location / { root /usr/share/nginx/html; index index.html index.htm; } }
cert目录:
2.尝试HTTP方式进行IP访问
3.尝试HTTPS方式进行IP访问
需要安装CA证书,才能验证,
4.安装CA证书
将rootCA.crt复制到本地电脑,双击即可安装。
5.还有问题
chrome中F12即可看到错误信息
缺少Subject Alternative Name(SAN)
6.尝试域名访问
六:SAN证书
1.什么是san证书
SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
现在都SAN了,看来我们自己生成证书缺少这一项,所以在现在安全条件下,被认为不安全了。
2.生成带SAN扩展的证书请求文件
openssl req -new -sha256 -key server.key \ -subj "/C=CN/ST=HeNan/L=ZhengZhou/O=JACKADAM/OU=jack/CN=server.jackadam.ml/emailAddress=jackadam@sina.com" \ -extensions v3_req \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "[req]\nreq_extensions = req_ext\n[req_ext]\nsubjectAltName=DNS:server.jackadam.ml")) \ -out SANserver.csr
查看两个证书请求的区别:
openssl req -noout -text -in server.csr openssl req -noout -text -in SANserver.csr
3.签名证书
openssl ca -in SANserver.csr \ -policy policy_anything \ -cert rootCA.crt \ -keyfile rootCA.key \ -batch \ -extensions SAN \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "[SAN]\nsubjectAltName=DNS:server.jackadam.ml")) \ -out ./SANserver.crt
openssl,说是不从请求中获取SAN扩展,还得手动配置,为了安全?
不过我从windowsCA服务器中,用请求文件签发证书,是会包含请求中的SAN扩展。
4.查看SAN证书
openssl x509 -text -noout -in SANserver.crt
5.更新nginx证书
有了使用者可选名称,这个证书就算是合格的证书了。