1、概念介绍:
什么是x509证书链
x509证书一般会用到三类文件,key,csr,crt。
Key是私用密钥,openssl格式,通常是rsa算法。
csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。
概念
首先要有一个CA根证书,然后用CA根证书来签发用户证书。
用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。
特别说明:
(1)自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
(2)根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。
数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。
2、实际实践
奇怪的地方在于,我用brpc的ssloption加载server.crt和server.key,会报:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca 错误,client端使用python request.get会报
requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=8288): Max retries exceeded with url: /GeneralClassifyService/process (Caused by SSLError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed'),))
后来使用了二中的ca.key.pem和ca.cert.pem,同时在请求时
verify="../../cret6/ca.cert.pem" cert=('../../cret6/client.cert.pem', '../../cret6/client.key.pem') res = requests.get(url, data=json.dumps(demo), verify=verify)
这样才请求成功
一、自签名的情况,RSA的公钥私钥只有一对,用私钥对公钥证书做签名。而我们的场景是,自己做CA,有一个CA的公钥私钥对。 而socket的服务端也有一个公钥私钥对。 用CA的私钥对socket服务端的公钥证书做签名。
1、创建key,没有用des3加密
openssl genrsa -out ca.key 1024
2、需要在提示之下输入许多信息,包括国家代码,省份,城市,公司机构名等
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
3、生成server端的私钥key:
openssl genrsa -out server.key 1024
4、生成server端的req文件(这一步生成的req文件,包含公钥证书,外加身份信息,例如国家,省份,公司等。用它提交给ca,让ca来对它做签名 ):
openssl req -new -key server.key -out server.csr
5、用CA的私钥对server的req文件做签名,得到server的证书:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
二、使用加密的方式生成,这里每次需要输入的密码都是一致的。未明了的地方在,作者提示:CA的公用名不能与客户端和服务器证书的公用名相同The Common Name for the CA cannot be the same as the Common Name for the client and server certificates.
openssl genrsa -out -des3 ca.key.pem 2048 openssl genrsa -out server.key.pem 2048 openssl genrsa -out client.key.pem 2048 openssl req -x509 -new -nodes -key ca.key.pem -sha256 -days 365 -out ca.cert.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=FoobarCA openssl req -new -sha256 -key server.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out server.csr openssl x509 -req -in server.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out server.cert.pem -days 365 -sha256 openssl req -new -sha256 -key client.key.pem -subj /C=US/ST=CA/L=Somewhere/O=Someone/CN=Foobar -out client.csr openssl x509 -req -in client.csr -CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -out client.cert.pem -days 365 -sha256
转自:https://stackoverflow.com/questions/53104296/unknown-ca-with-self-generated-ca-certificates-and-client-server
三、去除加密的方法
(1)添加密码
openssl rsa -aes256 -in your.key -out your.encrypted.key mv your.encrypted.key your.key chmod 600 your.key
-aes256表明使用AES256加密,加密算法共有:aes128
, aes192
, aes256
, camellia128
, camellia192
, camellia256
, des
(which you definitely should avoid), des3
or idea
(2)去除密码
openssl rsa -in your.key -out your.open.key
会需要输入一次密码
转自:https://security.stackexchange.com/questions/59136/can-i-add-a-password-to-an-existing-private-key
四、密钥证书的一些工具
(1)查看证书内容:
openssl x509 -in mycacert.crt -text -pubkey:打印公钥信息 -subject:打印出请求信息中申请者的信息值
(2)使用CA验证server证书
openssl verify -CAfile ca.cert.pem server.cert.pem