加解密技术


layout: default title: https证书的制作 createdate: 2014/07/24 15:12:29 last_modified_at: 2017/10/28 12:35:28 categories: 技巧 tags: cryptography keywords: https description: https证书的制作


目录

https证书制作

提供https加密服务需要两样东西: 私钥和证书。私钥保存在服务端, 不能告诉任何人。证书对外公开。

制作自签署名的证书

下面是使用openssh制作私钥和证书的过程:

//生成1024位的私钥
openssl genrsa -out server.key 1024               

//生成证书签署请求, 会提示输入证书相关信息, 注意输入的域名或hostname
openssl req -new -key server.key -out server.csr

	//这一步会提示输入证书信息, 注意Common Name要输入正确, 如下:
		Common Name (eg, your name or your server's hostname) []:192.168.88.130
	//或者使用通配符, 如下
		Common Name (eg, your name or your server's hostname) []:*.baidu.com

//自签署证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

也可以使用下面命令,直接得到自签署的证书:

openssl req  -nodes -new -x509 -days 365 -keyout server.key -out server.crt

制作完成后得到证书(server.crt)和私钥(server.key), 这两个文件就可以直接用到web服务器中, 用来提供https服务。

但是由于是自签署的, 浏览器会提示证书不可信。可以将第二步生成的server.csr提供给专业的CA机构, 由他们签署。

CA机构的根证书一般作为可信根证书默认集成到浏览器里, 因此他们签署的证书可以通过浏览器的检查。不过他们是商业机构, 需要付费.

注意向CA机构申请签署时, 并不需要你自己的私钥!只需要提供.csr文件。你的私钥任何时候都不能告诉别人!

可直接使用脚本create_root_cert.sh,进行上面的过程。

可以用openssl x509 -in <证书> -noout -text查看证书的细节。

利用自制根证书签署证书

可以假设我们自己就是一个CA机构, 用我们自己的根证书来签署证书。

首先按照上一节的方式,专门生成一个作为CA根证书的自签署证书, 得到xca.crt和xca.key:

openssl genrsa -out xca.key 1024               
openssl req -new -key xca.key -out xca.csr
openssl x509 -req -days 365 -in xca.csr -signkey xca.key -out xca.crt

然后制作一个等待签署的请求, 得到server.csr:

openssl genrsa -out server.key 1024               
openssl req -new -key server.key -out server.csr

再用xca.crt和xca.key对server.csr进行签署, 得到证书server.crt:

openssl x509 -req -days 365 -in server.csr -CA xca.crt -CAkey xca.key -CAcreateserial  -out server.crt 

注意: 这一步不需要提供私钥server.key

这时候就可以使用server.key和server.crt提供https服务了。但是浏览还是提示证书不可信,所以还需要最后一步

把自己制作的根证书xca.crt导入的浏览器中, 类别是"受信任的的根证书颁发机构"。

用这种方式只要在浏览器中导入了自制的CA证书, 就可以随意签署证书了。问题就是需要用户手工导入证书, 真要商用了还是去CA机构买个吧, 虽然也有例外, 比如强势的12306以前就是这么干的…

在config中设置证书信息

在生成证书签署请求的时候需要添加国家、地区、邮箱等信息, 这些信息可以在config文件中提前编辑好,就不用每次填写了。

[ req ]                                                                                                                                                                                                            
prompt                 = yes 
default_bits           = 2048
default_keyfile        = Cert1/cert1-key.pem
distinguished_name     = req_distinguished_name
attributes             = req_attributes
x509_extensions        = v3_ca

dirstring_type = nobmp

[ req_distinguished_name ]


countryName                    = Country Name (2 letter code)
countryName_default            = CN
countryName_min                = 2 
countryName_max                = 2 

localityName                   = Locality Name (eg, city)
localityName_default           = BeiJing

organizationalUnitName         = Organizational Unit Name (eg, section)
organizationalUnitName_default = ZNR 

commonName                     = Common Name (eg, YOUR name)
commonName_default             = lijiao
commonName_max                 = 64

emailAddress                   = Email Address
emailAddress_default           = [email protected]
emailAddress_max               = 40


[ req_attributes ]
challengePassword              = A challenge password
challengePassword_min          = 4 
challengePassword_max          = 20

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = CA:true

生成签署请求的时候,指定config文件:

openssl req -new  -out Cert1/cert1.csr -config ./cert1.req.config

example

X.509证书

X.509

X509v3 rfc

docker证书制作

docker证书的制作

GPG

GPG入门教程

问题记录

cannot validate certificate for X.X.X.X because it doesn’t contain any IP SANs’

SSL needs identification of the peer, otherwise your connection might be against a man-in-the-middle which decrypts + sniffs/modifies the data and then forwards them encrypted again to the real target. Identification is done with x509 certificates which need to be validated against a trusted CA and which need to identify the target you want to connect to.
Usually the target is given as a hostname and this is checked against the subject and subject alternative names of the certificate. In this case your target is a IP. The validate the certifcate successfully the IP must be given n the certificate inside the subject alternative names section, but not as an DNS entry (e.g. hostname) but instead as IP.
So what you need to is:
	Edit your /etc/ssl/openssl.cnf on the logstash host - add subjectAltName = IP:192.168.2.107 in [v3_ca] section.

参考

  1. create_root_cert.sh

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球