• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Windows下用OpenSSL生成CA根证书和签发server端证书

武飞扬头像
大飞飞鱼
帮助1

       为了解决浏览器https的需求,很多时候,需要向某些机构高价购买网站证书,花不少的钱。其实签发证书是非常简单的技术活,在某些机构里,签发一个https的证书一年需要几K或者更多的钱,跟抢钱一样,完全不划算。本文介绍的是自己生成网站的域名证书、IP证书,可以用于开发测试,局域网部署;当然也可以用于公网部署,只要您能引导用户在浏览器端下载安装你自己生成的CA根证书即可。对某些特殊局部业务系统,完全可以自己生成CA证书,没有必要花冤枉钱来购买某些认证机构签发的证书。
     根证书的概念请参见: 
https://blog.csdn.net/ababab12345/article/details/120202618

一、先下载编译好的OpenSSL程序,并展开后放在E:盘,目录结构如下所示

学新通

 目前放在的目录为:E:\OpensslX64

二、打开一个CMD控制台窗口,设置好openssl.cnf路径

用以下控制台命令进入到 E:\OpensslX64\bin,并设置好openssl.cnf路径。

  1.  
    E:
  2.  
    cd E:\OpensslX64\bin
  3.  
    set OPENSSL_CONF=E:\OpensslX64\conf\openssl.cnf

 三、在当前目录 E:\OpensslX64\bin 里创建两个子目录

这些子目录将用于存放后续产生的key文件与证书文件等。

  1.  
    mkdir certs
  2.  
    mkdir private

certs目录:存放已颁发的证书文件
private目录:存放私钥文件

生成一个随机数

openssl rand -out private/.rand 1000

四、生成根证书

根证书是用于证书签发的,证书的签发机构都有自己的根证书。他们的根证书一般已经打包到浏览器的受信任的根证书目录里了,我们自己签发的需要手工安装到这个目录。

4.1 生成根证书私钥文件(pem文件)

OpenSSL使用PEM(Privacy Enbanced Mail)格式来保存私钥,生成私钥的命令如下:

openssl genrsa -aes256 -out private/cakey.pem 1024

这一步会提示输入密码,

Enter pass phrase for private/cakey.pem:
请输入一个容易记忆的密码,以后产生其它文件时需要输入。我输入了:123456

该命令的相关参数解释如下:
 

该命含义如下:

genrsa: 使用RSA算法产生私钥
-aes256: 使用256位密钥的AES算法对私钥进行加密
-out: 输出文件的路径
1024: 指定私钥长度

4.2 生成根证书签发申请文件(csr文件)
这一步需要使用上一步生成的私钥(pem文件),所以你需要记住上一步自己设置的密码。
生成证书请求文件(csr文件)的命令如下:

openssl req -new -key private/cakey.pem -out private/ca.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Mediasoft/OU=Mediasoft/CN=Mediasoft"

该命令的相关参数如下:
 

该命令含义如下:

req: 执行证书签发命令
-new: 新证书签发请求
-key: 指定私钥路径,这个是上一步产生的key文件
-out: 输出的csr文件的路径,这个是即将产生的请求文件,需要用这个文件来产生证书
-subj: 证书相关的用户信息(subject的缩写),一些自己定义的相关信息

4.3 签发根证书(cer文件)

用上一步生成的csr,可以自己签发根证书:

openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/cakey.pem -in private/ca.csr -out certs/ca.cer

该命令的相关参数如下:

x509: 生成x509格式证书
-req: 输入csr文件
-days: 证书的有效期(天)
-sha1: 证书摘要采用sha1算法
-extensions: 按照openssl.cnf文件中配置的v3_ca项添加扩展
-signkey: 签发证书的私钥,第一步生成的Key文件
-in: 要输入的csr文件,上一步生成的csr文件
-out: 输出的cer证书文件

将在certs目录里生成的ca.cer根证书文件,根证书文件可以用于再次签发server证书,即用于nginx的服务器端证书,或client证书。 

根证书通常是用于证书签发机构签发证书与分发到支持的客户端的,例如分发到Chrome浏览器的安装程序里,大多数情况下,你无法让Google等浏览器厂家将你的根证书安装到它们浏览器的证书根目录 ,但可以自己手工安装刚才签发的根证书。手工安装步骤:步骤 1-〉2-〉3-〉4如下:

学新通

 五、用根证书签发server端证书

5.1 生成服务端证书私钥
 

  1.  
    openssl genrsa -aes256 -out private/server.key 1024
  2.  
     
  3.  
    openssl rsa -in private/server.key -out certs/server.key

5.2 生成请求文件

openssl req -new -key private/server.key -out private/server.csr -subj "/C=CN/ST=myprovince/L=mycity/O=xxxsoft/OU=xxxsoft/CN=xxxsoft"

5.3 使用根证书签发服务端证书
 

openssl x509 -req -days 7304 -CA certs/ca.cer -CAkey private/cakey.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.crt

这里有必要解释一下这几个参数:

-CA:指定CA证书的路径,为第四步生成的CA证书
-CAkey: 指定CA证书的私钥路径
-CAserial: 指定证书序列号文件的路径
-CAcreateserial: 表示创建证书序列号文件(即上方提到的serial文件),创建的序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀

 在x509指令中,有多种方式可以指定一个将要生成证书的序列号,可以使用set_serial选项来直接指定证书的序列号,也可以使用-CAserial选项来指定一个包含序列号的文件。所谓的序列号是一个包含一个十六进制正整数的文件,在默认情况下,该文件的名称为输入的证书名称加上.srl后缀,比如输入的证书文件为ca.cer,那么指令会试图从ca.srl文件中获取序列号,可以自己创建一个ca.srl文件,也可以通过-CAcreateserial选项来生成一个序列号文件。
 

解决Chrome浏览器 NET::ERR_CERT_COMMON_NAME_INVALID错误。

可以使用扩展文件来在证书里嵌入扩展信息,例如DNS信息,IP信息,DNS信息的文件样本如下(手工生成的一个文件:private/server.dns.ext):

  1.  
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  2.  
    extendedKeyUsage = serverAuth, clientAuth
  3.  
    subjectAltName=@SubjectAlternativeName
  4.  
     
  5.  
    [ SubjectAlternativeName ]
  6.  
    DNS.1=test.domain.com
  7.  
    DNS.2=www.domain.com

 IP扩展信息的样本如下(手工生成的一个文件:private/server.ip.ext):

  1.  
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  2.  
    extendedKeyUsage = serverAuth, clientAuth
  3.  
    subjectAltName=@SubjectAlternativeName
  4.  
     
  5.  
    [SubjectAlternativeName]
  6.  
    IP.1=192.168.1.203
  7.  
    IP.2=192.168.1.204

 嵌入DNS信息以支持解决Chrome浏览器备用名的命令如下:

openssl x509 -req -days 7304 -CA certs/ca.cer -CAkey private/cakey.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.crt -extfile private/server.dns.ext

 由于Chrome浏览器加载证书时要读取扩展信息验证域名或者IP,如果没有这个信息,则会发生Chrome不能识别证书通用名称NET::ERR_CERT_COMMON_NAME_INVALID错误。此服务器无法证实它就是 domain.com - 它的安全证书没有指定主题备用名称。

六、最后,使用server证书

如果是Nginx,将以上certs目录里生成的 server.key与server.crt复制到证书相关目录下并进行相关设置即可。

如下: 

  1.  
    server {
  2.  
    listen 8443 ssl;
  3.  
    server_name test.domain.com;
  4.  
     
  5.  
    ssl_certificate ssl/server.crt;
  6.  
    ssl_certificate_key ssl/server.key;
  7.  
     
  8.  
    ...
  9.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcieec
系列文章
更多 icon
同类精品
更多 icon
继续加载