https证书互信解决方案—建立私有CA并申请证书

前言

https相较于http而言有很大的安全性,当咱们一个服务开启https并与之通讯时,每每须要证书的认证,若是是浏览器访问服务,只要在浏览器内设置信任证书便可,而若是是程序内访问服务(如java程序),则须要导入该服务的证书所信任的证书。java

实际状况中,内部系统的互相通讯使用https,每每不可能向公有CA申请证书(申请证书须要很高的费用),故咱们须要建立一个私有CA来申请证书实现https通讯。web

名词介绍

CA和证书认证

详见个人一篇博文:https简单解读segmentfault

实现步骤

环境介绍

  1. 64位 centos 7.X操做系统
  2. 装有openssl命令

构建私有CA

CA要给别人签发证书,首先本身得有一个做为根证书,咱们得在一切工做以前修改好CA的配置文件、序列号、索引等等。centos

输入如下命令更改配置文件:浏览器

vi /etc/pki/tls/openssl.cnf

配置文件更改如下部分:安全

[ CA_default ]
 
dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.
 
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem # The private key
RANDFILE        = $dir/private/.rand    # private random number file
...
default_days    = 3650                  # how long to certify for
...
# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

在/etc/pki/CA目录建立两个文件index.txt和serial:服务器

cd /etc/pki/CA && touch index.txt serial && echo 01 > serial

仍在当前目录下生成一个CA私钥cakey.pem和自签证书cacert.pem:dom

openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -out cacert.pem

生成公钥的时候会提示输入一些信息,例子以下:操作系统

Country Name (2 letter code) []:CN                                 #国家名
State or Province Name (full name) []:hangzhou                     #省份名
Locality Name (eg, city) []:hangzhou                               #地名
Organization Name (eg, company) []:company                         #公司名
Organizational Unit Name (eg, section) []:unit                     #部门名
Common Name (eg, your websites domain name) []:localhost           #服务域名
Email Address []:                                                  #电子邮件

后面一些信息可按回车略过code

这里比较重要的是Comman Name填写的是服务的域名地址,即若是该证书用于某个服务则填该服务的域名地址(如用于百度服务器,则填写www.baidu.com)

本方案的CA证书不用于某个服务,故可填localhost

私有CA签署证书

为一个服务生成私钥server.key和一个证书请求文件server.csr:

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

生成证书请求文件时,仍会提示输入一些信息,例子以下:

Country Name (2 letter code) []:CN                                 #国家名
State or Province Name (full name) []:hangzhou                     #省份名
Locality Name (eg, city) []:hangzhou                               #地名
Organization Name (eg, company) []:company                         #公司名
Organizational Unit Name (eg, section) []:unit                     #部门名
Common Name (eg, your websites domain name) []:XXX.XXX.XXX         #服务域名
Email Address []:                                                  #电子邮件

这里的Common Name就应该填你实际服务所用的域名了

下面将该证书请求文件server.csr由你构建的私有CA签署,生成一个server.crt证书:

openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt

到此为止,server.crt证书可用于服务提供https访问,客户端若想访问该服务,导入CA根证书cacert.pem便可。

相关文章
相关标签/搜索