1、openssl生成证书
1.1 RSA加密
以下步骤生成了CA、服务端和客户端所需要的证书,以实现双向认证
@echo off
set OPENSSL_CONF=/usr/lib/ssl/openssl.cnf
#CA,不加-des3则不用密码
echo Generate CA key:
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
echo Generate CA certificate:
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=CA/CN=MyRootCA"
#服务端
echo Generate server key:
openssl genrsa -passout pass:1111 -des3 -out server.key 4096
echo Generate server signing request:
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=server/CN=yxserver"
echo Self-sign server certificate:
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
echo Remove passphrase from server key:
openssl rsa -passin pass:1111 -in server.key -out server.key
#客户端
echo Generate client key
openssl genrsa -passout pass:1111 -des3 -out client.key 4096
echo Generate client signing request:
openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=client/CN=nmclient"
echo Self-sign client certificate:
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
echo Remove passphrase from client key:
openssl rsa -passin pass:1111 -in client.key -out client.key
一个简单点的rsa证书生成
#生成CA私钥
openssl genrsa -out root_ca.key
#生成CA证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key root_ca.key -new -out root_ca.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=CA/CN=NMRootCA"
#生成CA证书
openssl x509 -req -in root_ca.req -signkey root_ca.key -out root_ca.pem
#生成客户端私钥
openssl genrsa -out rsa_client.key
#生成客户端证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key rsa_client.key -new -out rsa_client.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=client/CN=nmclient"
#通过CA私钥签发客户端证书
openssl x509 -req -days 365 -in rsa_client.req -CA root_ca.pem -CAkey root_ca.key -out rsa_client.pem -CAcreateserial
rm root_ca.req
rm root_ca.srl
rm rsa_client.req
1.2 ECC加密方式
1.2.1 同一个CA签署的证书
#生成CA私钥
openssl ecparam -out EccCA.key -name prime256v1 -genkey
#生成CA证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key EccCA.key -new -out EccCA.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=CA/CN=MyRootCA"
#生成CA证书
openssl x509 -req -days 365 -in EccCA.req -signkey EccCA.key -out EccCA.pem
rm EccCA.req
#生成服务端私钥
openssl ecparam -out ecc_server.key -name prime256v1 -genkey
#生成服务端证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key ecc_server.key -new -out ecc_server.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=server/CN=yxserver"
#通过CA私钥签发服务端证书
openssl x509 -req -days 365 -in ecc_server.req -CA EccCA.pem -CAkey EccCA.key -out ecc_server.pem -CAcreateserial
rm ecc_server.req
#生成客户端私钥
openssl ecparam -out ecc_client.key -name prime256v1 -genkey
#生成客户端证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key ecc_client.key -new -out ecc_client.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=client/CN=yxclient"
#通过CA私钥签发客户端证书
openssl x509 -req -days 365 -in ecc_client.req -CA EccCA.pem -CAkey EccCA.key -out ecc_client.pem -CAcreateserial
rm ecc_client.req
1.2.2 不同CA签署的证书
客户端使用服务端的ca证书、客户端自己的证书和私钥;
服务端使用客户端的ca证书、服务端自己的证书和私钥;
实测可以实现相互验证。
#生成server的ca证书
#生成CA私钥
openssl ecparam -out server_ca.key -name prime256v1 -genkey
#生成CA证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key server_ca.key -new -out server_ca.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=CA/CN=PLCN1RootCA"
#生成CA证书
openssl x509 -req -days 365 -in server_ca.req -signkey server_ca.key -out server_ca.pem
rm server_ca.req
#生成服务端私钥
openssl ecparam -out ecc_server.key -name prime256v1 -genkey
#生成服务端证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key ecc_server.key -new -out ecc_server.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=server/CN=yxserver"
#通过CA私钥签发服务端证书
openssl x509 -req -days 365 -in ecc_server.req -CA server_ca.pem -CAkey server_ca.key -out ecc_server.pem -CAcreateserial
rm ecc_server.req
#生成client的ca证书
#生成CA私钥
openssl ecparam -out client_ca.key -name prime256v1 -genkey
#生成CA证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key client_ca.key -new -out client_ca.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=CA/CN=NMRootCA"
#生成CA证书
openssl x509 -req -days 365 -in client_ca.req -signkey client_ca.key -out client_ca.pem
rm client_ca.req
#生成客户端私钥
openssl ecparam -out ecc_client.key -name prime256v1 -genkey
#生成客户端证书请求
openssl req -config /usr/lib/ssl/openssl.cnf -key ecc_client.key -new -out ecc_client.req -subj "/C=CN/ST=FJ/L=XM/O=YaXon/OU=client/CN=yxclient"
#通过CA私钥签发客户端证书
openssl x509 -req -days 365 -in ecc_client.req -CA client_ca.pem -CAkey client_ca.key -out ecc_client.pem -CAcreateserial
rm ecc_client.req
2、去除证书中存在的^M段元字符
基于DOS/Windows的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行,即win每行结尾为\r\n,而linux只有一个\n。
如果win下的文档上传到linux,每行的结尾都会出现一个^M,cat -A filename 就可以看到windows下的断元字符 ^M,有几个方法可以去除它
第一种方法:
要去除他,最简单用下面的命令:
dos2unix filename
第二种方法:
sed -i 's/^M//g' filename
#注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M
第三种方法:
vi filename:1,$ s/^M//g^M
#输入方法:ctrl+V ,ctrl+M
第四种方法:
cat filename |tr -d '/r' > newfile
#^M 可用 /r 代替
3、转换回车换行为换行
#回车换行转换行
sed 's/\r$//g' 11.txt > 22.txt
#查看文件换行情况
cat -A file
或
vi -b file 然后 : ,输入set list
4、password、passcode和passphrase
passphrase和 passcode都是password的一种。
passphrase是满足了一定规则约束的password, 安全性要高一些;
passcode一般指由纯数字组成的password.
5、证书和证书链简单介绍
根据现在做的项目来说,服务端证书就是CA签名过的公钥,证书链就是CA证书的合集(包含CA中间证书和根证书)。
其他资料如下,来源:https://zhuanlan.zhihu.com/p/100389013
在校验证书的过程中,从证书开始,会依次找到证书的签署CA证书,以及签发该CA证书的上级证书,一直到根证书也就是自签名证书,这样就形成了一个链,称为证书链, 通过证书查看工具可以看到这样一个树形结构:

市面上绝大多数服务器证书都是通过中间CA证书签署的,但只有很少一部分中间CA证书内置在浏览器或者操作系统中,这样浏览器在验证的时候,就有可能会遇到拿不到中间CA证书而导致校验失败。 我们曾经有个大客户反馈在使用铃盛服务的时候,通过单点登录系统有些终端(比如Android手机)不能登录,运维人员从铃盛的后台系统日志找不到任何错误信息,最后这个问题转到开发团队来。 客户的问题就是我们的问题,经过一番排查,发现问题是在单点登录跳回客户自己的IDP去做认证的时候,页面出不来,结合只有部分终端有问题,怀疑可能是证书链没配置好,果然通过openssl工具验证,发现服务器返回的证书链不完整从而导致有些终端没法验证证书链的有效性。
服务器返回的证书链不完整为什么会导致有些终端验证失败,有的终端验证又没有问题呢?原来不同平台的浏览器当发现服务器没有返回中间CA证书时,并没有统一的处理方式,有些浏览器比如windows平台或者IOS平台会根据证书中的“Authority Information Access"扩展字段提供的CA证书URL去自动下载中间CA证书, 从而完成证书链的校验,但有些平台,比如Android系统,如果服务器不返回中间CA证书,并不会去自动下载,而是直接报错。

检查证书链是否完整可以通过openssl命令来检查,网上也有很多在线的工具可以检查,例如:https://www.ssllabs.com,如果是openssl可以运行“openssl s_client -connect domain:443”进行检查,“domain”是你要检查的站点域名,比如:

为了保证浏览器证书链的校验,比较可靠的方式是在服务端配置好,如果使用Nginx的话,可以简单把服务器证书,中间CA证书按照顺序合并在同个文件就可以,证书文件一般是PEM格式,用普通的文本编辑器就可以打开并编辑。
6、openssl证书验证
6.1 用根证书/证书链验证用户证书合法性
openssl verify -CAfile rootCA.crt server.cert
:ok
#succ ret ok
#如果出现certificate has expired,表示证书过期,要重新生成了,不然无法正常通讯
6.2 验证证书和私钥是否匹配
#私钥
openssl pkey -in privateKey.key -pubout -outform pem | sha256sum
#证书
openssl x509 -in certificate.crt -pubkey -noout -outform pem | sha256sum
#证书请求文件
openssl req -in CSR.csr -pubkey -noout -outform pem | sha256sum
#然后对比哈希值,一致即表示匹配,也可以去掉最后的 | sha256sum 参数,看公钥结果是否一致也行
6.3 检查服务器SSL连接
#通过服务器ca证书验证服务器证书
openssl s_client -CAfile ../server/CA.crt -connect 172.31.234.26:60051 -status
openssl s_client -CAfile ../server/CA.crt -connect 172.31.234.26:60051 -prexit
#打印握手协议信息
openssl s_client -CAfile ../server/CA.crt -connect 172.31.234.26:60051 -msg
#测试网站证书
openssl s_client -connect www.example.com:443 -showcerts
#测试支持的协议 -tls1_2、-tls1_1、-tls1
6.4 通过openssl创建服务端和客户端进行ssl测试
双向验证
openssl s_server -accept 443 -Verify client_ca_cert.crt -key server_private_key.pem -cert server_cert.crt -CAfile client_ca_cert.crt -debug -msg -verify_return_error
openssl s_client -connect 172.31.234.26:443 -key client_key.pem -cert client_cert.pem -CAfile ../server/server_ca_cert.crt -msg -debug -verify_return_error
# 调试过程可以输入一下指令
q 中断当前连接,但不关闭server.
Q 中断当前连接,退出程序。
r 进行renegotiate(重新协商)行为。
R 进行renegotiate(重新协商)行为, 并且要求client的证书。
实际设备测试
openssl s_server -accept 4433 -Verify ca-CertificateChains.crt -key DeviceKey.pem -cert ca-certificates.crt -CAfile ca-CertificateChains.crt -debug -msg -verify_return_error
openssl s_client -connect 172.31.234.26:4433 -key clientKey.pem -cert clientCert.pem -CAfile ../server/serverCA.crt -msg -debug -verify_return_error
7 curl命令行模式
7.1 通过curl进行https访问
curl -v <https://www.example.com> --cacert server-ca-cert.pem --key client-private-key.pem --cert client-cert.crt -H 'Accept: */*' -H 'Accept-Encoding: gzip,deflate' -H 'Content-length: 4' -d 'AAA='
#-H,增加头部信息
#-d body部分内容
#cat example
curl -v https://accenture-backend/receiver --cacert /mnt/flash/app/server-ca-china.pem --key /mnt/flash/app/client-private-key.pem --cert /usrdata/cert/ca-certificates.crt -H 'X-transmissiontype:BinaryMessage' -H 'X-MessageyType:10258' -H 'X-MessagePriority: 1' -H 'Content-Type: text/plain;charset=UTF-8' -H 'Content-length: 4' -d 'AAA='
curl -v https://accenture-backend/configuration --cacert /mnt/flash/app/server-ca-china.pem --key /mnt/flash/app/client-private-key.pem --cert /usrdata/cert/ca-certificates.crt -H 'X-transmissiontype:BinaryMessage' -H 'X-MessageyType:10258' -H 'X-MessagePriority: 1' -H 'Content-Type: text/plain;charset=UTF-8' -H 'Content-length: 4' -d 'AAA='
curl -v https://accenture-backend/configuration --cacert /mnt/flash/app/server-ca-china.pem --key /mnt/flash/app/client-private-key.pem --cert /usrdata/cert/ca-certificates.crt
本文详细介绍了如何使用openssl生成RSA和ECC加密方式的证书,包括同一CA和不同CA签署的证书。同时,讲解了去除证书中^M字符的方法,以及证书链、passphrase的概念。此外,还探讨了openssl证书验证和curl命令行模式下的HTTPS访问,涵盖服务器SSL连接检查和双向认证的实际测试。
1411

被折叠的 条评论
为什么被折叠?



