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加密服务需要两样东西: 私钥和证书。私钥保存在服务端, 不能告诉任何人。证书对外公开。
下面是使用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文件中提前编辑好,就不用每次填写了。
[ 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
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.