使用OpenSSL工具制作X.509证书的方法及其注意事项总结

如何使用OpenSSL工具生成根证书与应用证书

本文由CSDN-蚍蜉撼青松 【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!

一、步骤简记

// 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认)
openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt
// 为顶级CA的私钥文件去除保护口令
openssl rsa -in CARoot1024.key -out CARoot1024.key
// 生成顶级CA的公钥证书和私钥文件,有效期15年(RSA 2048bits,指定)
openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt
// 为顶级CA的私钥文件去除保护口令
openssl rsa -in CARoot2048.key -out CARoot2048.key 

// 为应用证书/中级证书生成私钥文件
openssl genrsa -out app.key 2048
// 根据私钥文件,为应用证书/中级证书生成 csr 文件(证书请求文件)
openssl req -new -key app.key -out app.csr
// 使用CA的公私钥文件给 csr 文件签名,生成应用证书,有效期5年
openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything
// 使用CA的公私钥文件给 csr 文件签名,生成中级证书,有效期5年
openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything

以上是生成根证书与应用证书过程中要用到的所有命令,根据生成目标不同,分为三组。其中,前面两组都用于生成自签名的顶级CA(区别只在于密钥长度不同),实际应用中只需根据需求选择一组即可。

最后一组用于生成非自签名的证书,包括中级证书与应用证书。所谓中级证书,是具有继续颁发下级证书权限的子CA,而本文中所说的应用证书,特指不能用来继续颁发下级证书,只能用来证明个体身份的证书。顶级CA在签发二者的时候,只是多少一个 -extensions v3_ca 选项的区别,这个选项赋予被签发的证书继续签发下级证书的权力。

二、各步详解

2.1 生成自签名根证书(即顶级CA)

典型示例:openssl req -new -x509 -days 5480 -keyout CA.key -out CA.crt

[1] 命令选项和参数解读

示例中,各选项(及参数)的意义如下:

req              //使用openssl的req子命令
-new             //生成新的证书请求
-x509            //生成自签名证书
-days 5480       //自签名证书的有效期5480天(15年)【仅当使用了 -x509 选项后有效】
-keyout CA.key   //私钥文件名指定为CA.key【此选项的一般作用是新生成文件命名;但若同时使用了-key选项,则此选项用于原私钥文件的更名】
-out CA.crt      //指定输出所生成自签名证书的信息到文件,且文件名为CA.crt【建议不要省略】

其中,-days,-keyout 两个选项可以省略,省略的话使用默认值,有效期默认为 30 天【由程序内部在变量初始化的时候指定,与配置文件无关】,私钥文件名的默认值由配置文件 openssl.cnf 中相关条目指定,没改过的话为 privkey.pem。

选项 -out 若是省略的话,openssl不会以文件形式输出生成的 证书/证书请求,而是会默认将文件的信息直接打印到屏幕上,这在大多数情况下,是不符合我们要求的。所以建议这个选项最好不要省略!

req子命令可以通过 -key 选项为证书请求指定使用一个已存在的私钥文件。但在示例中的情况下,虽然使用了-new 和 -x509两个选项,但没有使用 -key 选项,这时,req子命令会自动为自签名证书生成一个RSA私钥,密钥长度的默认值由配置文件 openssl.cnf 中的相关条目指定,没改过的话为 1024 bits。

[2] 关于私钥文件加密口令的指定

运行中会提示输入加密口令,如下:

writing new private key to ‘CA.key‘
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

此口令用于加密私钥文件 CA.key 中的私钥信息,如果不想在运行过程中还要输入加密口令,则可以使用选项 -passout 在命令中直接指定。选项 -passout 的使用形式为:

-passout arg

其中,arg是选项 -passout 的参数,其格式有多种,详参《OpenSSL官方文档》中关于"PASS_PHRASE_ARGUMENTS"的介绍。

本小节典型示例中的命令,可以用选项 -passout 改造如下:

openssl req -new -x509 -days 5480 -keyout CA.key
-out CA.crt -passout pass:1314

由于Linux系统中可以使用history命令查看历史指令记录,所以出于安全方面的考量,一般如非必要,不建议在命令中直接指定口令。这与mysql登录的时候不在 -p 选项里直接指定登录口令的原因是一致的。

[3] 关于证书请求文件中的DN字段

运行中会提示输入一些 Distinguished Name fields,即证书的识别名信息字段,简称为DN字段,如下:

You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:California
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:GeoAuth Inc.
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server‘s hostname) []:Authentication Global Root
Email Address []:.

这些DN字段大部分有默认值,默认值由配置文件 openssl.cnf中相关条目指定。如要在某一个DN字段使用默认值,则无需输入任何信息,直接点击"Enter"键;如果确实某个DN字段的值要置为空,则输入一个 ‘.
后,点击"Enter"键。

这些DN字段主要是拿来识别证书持有者身份的,下表是关于它们的缩写、说明和一些填写说明。【此部分参考了互动百科的SSL条目

DN字段名

缩写 说明 填写要求
Country Name C 证书持有者所在国家 要求填写国家代码,用2个字母表示
State or Province Name ST 证书持有者所在州或省份 填写全称,可省略不填
Locality Name L 证书持有者所在城市 可省略不填
Organization Name O 证书持有者所属组织或公司 最好还是填一下
Organizational Unit Name OU 证书持有者所属部门 可省略不填
Common Name CN 证书持有者的通用名 必填。

对于非应用证书,它应该在一定程度上具有惟一性;

对于应用证书,一般填写服务器域名或通配符样式的域名。

Email Address   证书持有者的通信邮箱 可省略不填

表2-1 DN字段的说明

:表中所谓,证书不是应用证书时,其持有者的通用名要有“唯一性”,是指其通用名不要与一般主机上常见的信任证书列表或撤销证书列表中的证书产生重复。

如果不想在运行过程中逐个输入这些DN字段的值,则可以使用 -subj 选项在命令中直接指定。选项 -subj 的使用形式为:

-subj arg

其中,arg是选项 -subj 的参数,其格式类似于:/type0=value0/type1=value1/type2=... 形式。每一个 /type=value 形式的单元,都对应了一个完整的DN字段。其中,

  • / 是每一个DN字段的开始标志;
  • type0、type1等等,就是表2-1中提到的DN字段名的缩写;
  • =是DN字段的名和值之间的间隔符;
  • value0、value1等等,就是原本你要在运行过程中逐个输入的DN字段的值。

对于您要将值置为空的DN字段,您可以略去不写。本小节典型示例中的命令,可以用 -subj 选项改造如下【略去了
L 与 OU 两个DN字段】:

openssl req -new -x509 -days 5480 -subj /C=US/ST=California/O=GeoAuth Inc./CN=Authentication\ Global\ Root -keyout CA.key -out CA.crt

需要特别注意的是,如果您设定的DN字段的值如果存在一些特殊字符【比如
 (空格)、((半角左括号)、)(半角右括号)……】,必须经过\(反斜杆)转义。上例中已经给出了空格转义的情况。

[4] 如何指定自签名证书的密钥长度和类型

如前所述,示例只能生成密钥长度为1024bits的RSA公私钥对。如果要生成密钥长度不为1024bits的RSA公私钥对,或是其他类型的【比如DSA、EC】公私钥对,则必须使用选项 -newkey 来代替 -new 。选项 -newkey 的用法比较复杂,如需详细了解,请参看《OpenSSL官方文档》的相关页面。本小节典型示例中的命令等效于以下命令:

openssl req -newkey rsa:1024 -x509 -days 5480 -keyout CA.key -out CA.crt

要生成一个密钥长度为2048bits的RSA公私钥对,命令为:

openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CA2048.key -out CA2048.crt

2.2 为顶级CA的私钥文件去除加密保护

上节提到,顶级CA的私钥文件是经过加密保护的,以后每当需读取 CA.key 文件中的私钥信息时,都需输入解密口令。这种做法适合有安全需求的场合,但如果觉得不方便,也可以去除这个口令。

典型示例:openssl rsa -in CA.key -out CA.key

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

rsa           //使用openssl的rsa子命令
-in CA.key    //经加密保护的私钥文件
-out CA.key   //解除加密保护后的私钥文件【可以改名】

[2] 关于私钥文件解密口令的指定

运行中会提示输入解密口令,如下:,

Enter pass phrase for CA.key:
writing RSA key

如果不想在运行过程中还要输入解密口令,则可以使用选项 -passin 在命令中直接指定。选项 -passin 的使用形式为:

-passin arg

其中,arg是选项 -passin 的参数,其格式同选项 -passout 的参数,详参《OpenSSL官方文档》中关于"PASS_PHRASE_ARGUMENTS"的介绍。

本小节典型示例中的命令,可以用选项 -passin 改造如下:

openssl rsa -in CA.key -out CA.key-passin
pass:1314

基于同选项 -passout 一样的考量,一般不建议直接在命令中指定解密口令。

[3] rsa子命令的实际功能

rsa子命令的功能,更完整来说,应该是RSA密钥的管理。除了此处用到的去除加密保护,还可以用来:更换加解密口令,更换加解密算法【DES、三重DES、IDEA(官方文档上提到过,但是有些版本好像不支持,比如说我安装的)、AES(官方文档上没提到,我安装的版本支持)】,更换密钥文件的编码方式,等等。

2.3 为应用证书/中级证书生成私钥文件

典型示例:openssl genrsa -out app.key 2048

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

genrsa         //使用openssl的genrsa子命令
-out app.key   //指定输出生成的私钥信息到文件,且文件名为app.key【建议别省略】
2048           //指定所生成私钥的比特长度【务必放在最后一个】

其中,选项 -out 若是省略的话,openssl不会以文件形式输出生成的 私钥信息,而是会默认将私钥的信息直接打印到屏幕上,这不符合我们的要求。所以建议这个选项不要省略!

genrsa子命令还可以有其他一些选项及参数,但不论还有多少选项,都必须把指定私钥长度的参数放在最后一个。【如果指定私钥长度的参数不是最后一个,则其后的参数好像会被舍弃。】

[2] 私钥文件的加密保护

本小节典型示例所给出的命令,生成的是未经任何加密保护的私钥文件。这种方式用起来比较方便,但非常不安全。如果要为私钥文件附加加密保护,则有两种方式:

A.在生成私钥文件的同时就指定输出前要用某种加密算法加密保护;

B.生成明文的私钥文件后用 rsa 子命令附加某种加密算法的加密保护。

我计算机上安装的openssl版本,在两种方式下都支持这些加密算法选项:-des,-des3,-aes128,-aes192,-aes256。以加密选用192位的AES算法为例,命令如下:

// 在生成私钥文件的同时就指定输出前要用192位的AES算法加密保护
openssl genrsa -aes192 -out app.key 1024
// 生成明文的私钥文件后用 rsa 子命令附加192位的AES算法加密保护
openssl rsa -aes192 -in app.key -out app.key 

上例中的两个命令,都会要求在运行中输入加密口令。同样的,虽然不建议,但是openssl依然支持在命令中使用选项 -passout 指定加密口令,选项 -passout 的用法参考2.1小节。唯一需要额外注意的是,对于genrsa子命令,选项 -passout 应放在 指定密钥长度的参数 前面。

2.4 为应用证书/中级证书生成 csr 文件【证书请求文件】

典型示例:openssl req -key app.key -out app.csr

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

req             //使用openssl的req子命令
-new            //生成新的证书请求
-key app.key    //指定是为app.key文件中的私钥生成证书请求
-out app.csr    //指定输出所生成证书请求的信息到文件,且文件名为app.csr

这和2.1节使用的是openssl的同一个子命令,所以参数的意义很多具有共通性。命令运行中也会要求输入一些DN字段的值,参看本文2.1 [3] 中的相关介绍。同样的,可以使用-subj选项在命令中直接指定这些DN字段的值。

2.5 为 csr 文件签名,生成应用证书/中级证书

典型示例:openssl ca -in app.csr -out app.crt -cert CA.crt -keyfile CA.key -days 1826 -policy policy_anything

[1] 命令选项和参数解读

示例中,各选项/参数的意义如下:

ca                        //使用openssl的ca子命令
-in app.csr               //指定待签发证书的 CSR文件为 app.csr
-out app.crt              //指定输出所签发证书的信息到文件,且文件名为app.crt【建议不要省略】
-cert CA.crt              //指定为应用/中级证书签名的CA的公钥证书为CA.crt【用到CA证书的持有者信息】
-keyfile CA.key           //指定为应用/中级证书签名的CA的私钥文件为CA.key【用CA私钥实际执行签名】
-days 1826                //指定所签发证书的有效期为1826天(5年)
-policy policy_anything   //指定签发策略为 policy_anything 【即,允许所签发证书的持有者信息和颁发者信息之间不遵守任何匹配策略】

其中,选项 -out 若是省略的话,openssl不会以文件形式输出生成的 应用证书/中级证书信息,而是会默认将证书的信息直接打印到屏幕上,这一般不符合我们的要求。所以建议这个选项不要省略!

[2] 关于签发策略

留待下次补充。先参看这这篇吧,http://hi.baidu.com/mars208/item/3b3022ec95a9d704570f1d49

[3] 关于签发中级证书(二级/三级CA,子CA)

留待下次补充。先参看这这篇吧,http://blog.chinaunix.net/uid-311680-id-2973653.html

三、常见问题及其解决

留待下次补充。

四、主要的一些参考资料

主要的信息来源是以下三个:

《OpenSSL编程》(赵春平 著)【一本难得的中文资料,未出版】

OpenSSL官方文档---OpenSSL命令

互动百科---SSL

一些前辈的博文,也对我快速定位问题提供了很大的帮助,列举如下:

博客园 - rusty,《Openssl使用生成CA总结》 ,提到了需要提前建好一些目录和文件

百度空间 - mars208,《使用openssl创建CA》,提到了签发策略的问题

ChinaUnix - ehyyngp,《使用openssl签发证书》,提到了中级证书的签发问题

------本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!------

使用OpenSSL工具制作X.509证书的方法及其注意事项总结

时间: 2024-11-16 19:29:34

使用OpenSSL工具制作X.509证书的方法及其注意事项总结的相关文章

基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good

上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非常通用的证书,什么是证书?唉!这么说吧!当两个人需要进行远程通信而又不想让第三个人知道时就必须建立一种安全措施,因为看不到对方的脸,又不能通过电话直接询问对方,就得想点别的办法,比如我设计一个密码,让后发短信告诉你,这样当我们在网上交流之前就可以对一下密码,暗号之类的.确认后就可以证明你的身份了.这

使用openssl工具生成证书

第一步. 生成rsa私钥文件 :\> openssl genrsa -out bexio.pem 1024 : 若要加密生成的rsa私钥文件(des3加密) :\> openssl genrsa -des3 -out bexio.pem 1024 第二步. 生成Certificate Signing Request(CSR - 证书请求文件) :\> openssl req -new -key bexio.pem -out bexio.csr -config openssl.cnf :

WCF X.509证书双向认证小结

最近在学习WCF X.509证书验证,想实现使用证书实现服务端和客户端的双向认证,实现原理是利用了数字证书包含的一对非对称密钥来实现数字签名及加密.所谓非对称密钥是采用两个密钥将加密和解密能力分开:一个公钥和一个私钥,公钥可解密私钥加密的信息,私钥也可以解密公钥加密的信息,前者用于数字签名后者用于信息加密,但从一个密钥是不可能分析出另一个密钥.利用非对称密钥的特点,我们将私钥签名的证书安装在服务端,把公钥签名的证书放在客户端,就可以实现使用证书实现服务端和客户端的双向认证.具体步骤如下: [1]

使用OpenSSL创建CA和申请证书

OpenSSL简介 OpenSSL是一种加密工具套件,可实现安全套接字层(SSL v2 / v3)和传输层安全性(TLS v1)网络协议以及它们所需的相关加密标准. openssl命令行工具用于从shell程序使用OpenSSL加密库的各种加密功能. 它可以用于: 创建和管理私钥,公钥和参数 公钥加密操作 创建X.509证书,CSR和CRL 消息摘要的计算 使用密码进行加密和解密 SSL / TLS客户端和服务器测试 处理S / MIME签名或加密的邮件 时间戳记请求,生成和验证 openssl

openssl工具详解及自建CA方法

前言: openssl是一款很强大的多用途的开源加密解密的命令行工具,比如创建私钥,创建证书签名请求,测试各种加密算法耗时等等. 在我们进入openssl工具讲解之前,我们有必要先了解先Linux下的加密解密方式,以及常用的加密算法与协议. 然后最后我们详细讲解使用openssl自建CA的方法 目录: 1. Linux加密解密过程: 如图: 2. 常用密码算法和协议 常用的加密算法有三种: 1. 对称加密算法: 同一个密钥可以同时用作信息的加密和解密,将明文分割成固定大小的块,逐个进行解密,这种

openssl工具的使用以及创建私有CA

openssl软件包在安装之后,主要会生成三段重要内容:加密库 ssl相关库文件 openssl命令行工具 下面就来介绍一下openssl命令行工具的使用: openssl和yum类似,有着许许多多的子命令: 如果要获得这些子命令的相关man文档,先使用whatis查看一下确定使用man的格式语法 其中常用的子命令有: 1.enc:实现对称加密,解密的命令 使用格式:openssl enc ciphername -a [-e] [-salt] -in filename -out filename

基于ssl协议和openssl工具建立私有CA

前言 要自建CA需先了解openssl工具和ssl协议还有各加密类型 ssl(Secure Socket Layer)安全套接字层当前版本为3.0,浏览器与Web服务器之间的身份认证和加密数据传输,它工作在传输层和各应用层之间,用户可以选择是否使用ssl进行传输,选择ssl协议将调用ssl函数库,端口也会发生变化. 加密类型 对称加密:任意加密数据块和流的内容,加密和解密用同一个密码, 通常明文通过算法和密钥生成密文,再由接受者用相同的密钥和算法解密获取明文. 算法:(DES.3DES.AES现

用Keytool和OpenSSL生成和签发数字证书

一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书      J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密钥.证书和证书链.Keytool工具的命令在JavaSE6中已经改变,不过以前的命令仍然支持.Keytool也可以用来管理对称加密算法中的密钥. 最简单的命令是生成一个自签名的证书,并把它放到指定的keystore文件中: keytool -genkey -alias tomcat -keyalg

ArcMap自定义脚本工具制作

原文 ArcMap自定义脚本工具制作 在制图的前期,一般需要做一些数据的整理,如图层合并.裁剪等工作.虽然在ArcMap中也有提供对应的工具,但使用起来需要点技巧.如批量裁剪,虽然可以实现,但出来的结果会重命名为[图层名]_clip,这样对于配置好整个区域的mxd,需要单独裁剪部分范围数据非常不友好,以为后续工作意味着需要单独给裁剪出来的数据重命名,删除掉后缀_clip才可以统一设置数据源. 解决这个问题其实可以很快速的编写python脚本去实现.但脚本对于一般人来说比较麻烦,每次使用都需要调整