openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


1.采用自定义配置文件的实现方法

1.1 自建CA

自建CA的机制:1.生成私钥;2.创建证书请求;3.使用私钥对证书请求签名。

由于测试环境,所以自建的CA只能是根CA。所使用的配置文件如下。

[default]
name = root-ca /* 变量*/
default_ca = CA_default
name_opt = ca_default
cert_opt = ca_default [CA_default]
home = . /* 变量*/
database = $home/db/index
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/$name.crt
private_key = $home/private/$name.key
RANDFILE = $home/private/random
new_certs_dir = $home/certs
unique_subject = no
copy_extensions = none
default_days =
default_crl_days =
default_md = sha256
policy = policy_to_match [policy_to_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional [CA_DN]
countryName = "C"
contryName_default = "CN"
organizationName = "O"
organizationName_default = "jmu"
commonName = "CN"
commonName_default = "longshuai.com" [req]
default_bits =
encrypt_key = no
default_md = sha256
utf8 = yes
string_mask = utf8only
# prompt = no /* 测试时该选项导致出错,所以将其注释掉*/
distinguished_name = CA_DN
req_extensions = ca_ext [ca_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash

(1).创建openssl的目录结构

(a).创建配置文件

[root@xuexi ~]# mkdir /ssl;touch /ssl/ssl.conf

[root@xuexi ~]# cd /ssl

[root@xuexi ssl]# vim ssl.conf

(b).创建openssl的目录结构中的目录,在上述配置文件中的目录分别为/ssl/db、/ssl/private和/ssl/certs,可以考虑将private目录的权限设置为600或者400。

[root@xuexi ssl]# mkdir /ssl/{db,private,certs}

[root@xuexi ssl]# chmod -R  private/

(2).CA自签名

普通的证书请求需要使用CA的私钥进行签名变成证书,既然是自签名证书那当然是使用自己的私钥来签名。可以使用伪命令req、ca、x509来自签名。

使用req伪命令创建CA

这里有两种方法:1.一步完成,即私钥、证书请求、自签名都在一个命令中完成2.分步完成,先生成私钥、再创建证书请求、再指定私钥来签名。方法2中其实生成私钥和证书申请可以合并在一步中完成,证书申请和签名也可以合并在一步中完成。

方法一:一步完成

在下面的一步命令中,使用-new由于没有指定私钥输出位置,所以自动保存在ssl.conf中default_keyfile指定的private.pem中;由于ssl.conf中的req段设置了encrypt_key=no,所以交互时不需要输入私钥的加密密码;由于使用req -x509自签名的证书有效期默认为30天,而配置文件中req段又不能配置该期限,所以只能使用-days来指定有效期限,注意这个-days选项只作用于x509签名,证书请求中如果指定了时间是无效的。

[root@xuexi ssl]# openssl req -x509 -new -out req.crt -config ssl.conf -days
[root@xuexi ssl]# ll
total
drwxr-xr-x root root Nov : certs
drwxr-xr-x root root Nov : db
drwx------ root root Nov : private
-rw-r--r-- root root Nov : private.pem /* 注意权限为644 */
-rw-r--r-- root root Nov : req.crt
-rw-r--r-- root root Nov : ssl.conf
[root@xuexi ssl]# openssl x509 -noout -dates -in req.crt
notBefore=Nov :: GMT
notAfter=Nov :: GMT

方法二:分步完成,这里把各种可能的步骤合并都演示一遍

>>创建私钥和证书请求合并而签名独自进行的方法<<

[root@xuexi ssl]# openssl req -newkey rsa: -keyout key.pem -out req1.csr -config ssl.conf -days
[root@xuexi ssl]# openssl req -x509 -in req1.csr -key key.pem -out req1.crt
[root@xuexi ssl]# openssl x509 -noout -dates -in req1.crt/* 注意签名不要配置文件 */
notBefore=Nov :: GMT
notAfter=Dec :: GMT /* 可以看到证书请求中指定-days是无效的 */
[root@xuexi ssl]# ll
total
drwxr-xr-x root root Nov : certs
drwxr-xr-x root root Nov : db
-rw-r--r-- root root Nov : key.pem
drwx------ root root Nov : private
-rw-r--r-- root root Nov : private.pem
-rw-r--r-- root root Nov : req1.crt
-rw-r--r-- root root Nov : req1.csr
-rw-r--r-- root root Nov : req.crt
-rw-r--r-- root root Nov : ssl.conf

>>独自生成私钥,而请求和签名合并的方法<<

[root@xuexi ssl]# (umask ;openssl genrsa -out key1.pem )
[root@xuexi ssl]# openssl req -x509 -new -key key1.pem -out req2.crt -config ssl.conf -days
[root@xuexi ssl]# openssl x509 -noout -dates -in req2.crt
notBefore=Nov :: GMT
notAfter=Nov :: GMT
[root@xuexi ssl]# ll
total
drwxr-xr-x root root Nov : certs
drwxr-xr-x root root Nov : db
-rw-r--r-- root root Nov : key1.pem
-rw------- root root Nov : key2.pem
drwx------ root root Nov : private
-rw-r--r-- root root Nov : private.pem
-rw-r--r-- root root Nov : req1.crt
-rw-r--r-- root root Nov : req1.csr
-rw-r--r-- root root Nov : req2.crt
-rw-r--r-- root root Nov : req.crt
-rw-r--r-- root root Nov : ssl.conf

>>完全分步进行<<

[root@xuexi ssl]# rm -rf key* req* private.pem
[root@xuexi ssl]# (umask ;openssl genrsa -out key.pem )
[root@xuexi ssl]# openssl req -new -key key.pem -out req.csr -config ssl.conf
[root@xuexi ssl]# openssl req -x509 -key key.pem -in req.csr -out req.crt -days
[root@xuexi ssl]# openssl x509 -noout -dates -in req.crt
notBefore=Nov :: GMT
notAfter=Nov :: GMT
[root@xuexi ssl]# ll
total
drwxr-xr-x root root Nov : certs
drwxr-xr-x root root Nov : db
-rw------- root root Nov : key.pem
drwx------ root root Nov : private
-rw-r--r-- root root Nov : req.crt
-rw-r--r-- root root Nov : req.csr
-rw-r--r-- root root Nov : ssl.conf

在本节的开头说明了创建证书请求时需要提供私钥,这个私钥的作用是为了提供公钥。下面是验证。

/* 提取私钥key.pem中的公钥到key.pub文件中 */
[root@xuexi ssl]# openssl rsa -in key.pem -pubout -out key.pub
/* 输出证书请求req.csr中的公钥部分 */
[root@xuexi ssl]# openssl req -noout -pubkey -in req.csr
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5
D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/
aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL
hU7nx+Du637UDlwdEQIDAQAB
-----END PUBLIC KEY-----
/* 查看key.pub,可以发现和req.csr中的公钥是一样的 */
[root@xuexi ssl]# cat key.pub
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5
D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/
aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL
hU7nx+Du637UDlwdEQIDAQAB
-----END PUBLIC KEY-----

虽然创建证书请求时使用的是公钥,但是却不能使用-key选项指定公钥,而是只能指定私钥,因为req -new或-newkey选项会调用openssl rsa命令来提取公钥,指定公钥该调用将执行失败。

使用x509伪命令创建CA

使用x509伪命令需要提供请求文件,因此需要先创建证书请求文件。由于x509伪命令签名时不读取配置文件,所以不需要设置配置文件,若需要某选项,只需使用x509中对应的选项来达成即可。

以下x509 -req用于自签名,需要-signkey提供签名所需私钥key.pem。

[root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf
[root@xuexi ssl]# openssl x509 -req -in req.csr -signkey key.pem -out x509.crt

使用ca伪命令创建CA

使用ca伪命令自签名会读取配置文件中的ca部分,所以配置文件中所需的目录和文件结构都需要创建好,包括目录db、private、certs,文件db/index、db/serial,并向serial中写入一个序列号。由于是自签名,可以自行指定私钥文件,因此对于签名所需CA私钥文件无需放置在private目录中。

[root@xuexi ssl]# touch db/{serial,index}
[root@xuexi ssl]# echo "" > db/serial
[root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf
[root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf

在此签名过程中有两次询问,如下:

Certificate is to be certified until Nov  ::  GMT ( days)
Sign the certificate? [y/n]:y out of certificate requests certified, commit? [y/n]y
Write out database with new entries
Data Base Updated

若要无交互,则使用-batch进入批处理模式。

[root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf -batch

1.2 为其他证书请求签名

CA为其他请求或证书签名时,需要使用到的文件有:自己的CA证书和自己的私钥文件。因此签名过程中需要提供这两个文件。

(1).使用ca伪命令为其他证书请求签名

使用ca伪命令自建根CA后,目录结构如下:

[root@xuexi ssl]# tree -R -C
.
├── certs
│ └── .pem
├── db
│ ├── index
│ ├── index.attr
│ ├── index.old
│ ├── serial
│ └── serial.old
├── key.pem
├── private
├── req.csr
└── ssl.conf

其中01.pem是根CA证书,key.pem是根CA私钥。

现在要为其他证书请求签名,首先创建其他请求吧,假设该请求文件/tmp/req.csr。

[root@xuexi ssl]# openssl req -new -keyout /tmp/key.pem -out /tmp/req.csr -config ssl.conf

使用根证书01.pem为/tmp/req.csr签名。

[root@xuexi ssl]# openssl ca -in /tmp/req.csr -keyfile key.pem -cert certs/.pem -config ssl.conf -batch

这样挺麻烦,因为每次为别人签名时都要指定-cert和-keyfile,可以将CA的证书和CA的私钥移动到配置文件中指定的路径下:

certificate = $home/$name.crt

private_key = $home/private/$name.key

[root@xuexi ssl]# mv certs/.pem root-ca.crt
[root@xuexi ssl]# mv key.pem private/root-ca.key

再使用ca签名时将可以使用默认值。

[root@xuexi ssl]# openssl ca -in /tmp/req.csr -config ssl.conf -batch

(2).使用x509伪命令为其他证书请求签名

现在根CA证书为root-ca.crt,CA的私钥为private/root-ca.key。

下面使用x509伪命令实现签名。由于x509不会读取配置文件,所以需要提供签名的序列号,使用-CAcreateserial可以在没有序列号文件时自动创建;由于x509默认-in指定的输入文件是证书文件,所以要对请求文件签名,需要使用-req来表示输入文件为请求文件。

[root@xuexi ssl]# openssl x509 -req -in /tmp/req.csr -CA root-ca.crt -CAkey private/root-ca.key -out x509.crt -CAcreateserial

2.采用默认配置文件/etc/pki/tls/openssl.cnf的实现方法

这是推荐采用的方法,因为方便管理,但使用默认配置文件,需要进行一些初始化动作。

由于完全采用/etc/pki/tls/openssl.cnf的配置,所以要建立相关文件。

自建CA的过程:

[root@xuexi tmp]# touch /etc/pki/CA/index.txt
[root@xuexi tmp]# echo "" > /etc/pki/CA/serial
[root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem # 创建CA的私钥
[root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr # 创建CA待自签署的证书请求文件
[root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr # 自签署
[root@xuexi tmp]# cp /etc/pki/CA/newcerts/.pem /etc/pki/CA/cacert.pem # 将自签署的证书按照配置文件的配置复制到指定位置

为他人颁发证书的过程:

[root@xuexi tmp]# openssl ca -in youwant1.csr

签署成功后,证书位于/etc/pki/CA/newcert目录下,将新生成的证书文件发送给申请者即可。

openssl签署和自签署证书的多种实现方式的更多相关文章

  1. (15) openssl签署和自签署证书的多种实现方式

    1.采用自定义配置文件的实现方法 1.1 自建CA 自建CA的机制:1.生成私钥:2.创建证书请求:3.使用私钥对证书请求签名. 由于测试环境,所以自建的CA只能是根CA. 所使用的配置文件如下: [ ...

  2. openssl x509(签署和自签署)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 主要用于输出证书信息,也能够签署证书请求文件.自签署.转换证书格式等. op ...

  3. (14) openssl x509(签署和自签署)

    主要用于输出证书信息,也能够签署证书请求文件.自签署.转换证书格式等. openssl x509工具不会使用openssl配置文件中的设定,而是完全需要自行设定或者使用该伪命令的默认值,它就像是一个完 ...

  4. openssl 自建CA签发证书 网站https的ssl通信

    <<COMMENTX509 文件扩展名 首先我们要理解文件的扩展名代表什么.DER.PEM.CRT和CER这些扩展名经常令人困惑.很多人错误地认为这些扩展名可以互相代替.尽管的确有时候有些 ...

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

    一)keytool生成私钥文件(.key)和签名请求文件(.csr),openssl签发数字证书      J2SDK在目录%JAVA_HOME%/bin提供了密钥库管理工具Keytool,用于管理密 ...

  6. 用openssl为WEB服务器生成证书(自签名CA证书,服务器证书)

    用openssl为WEB服务器生成证书(自签名CA证书,服务器证书) 来源: https://www.cnblogs.com/osnosn/p/10608455.html 来自osnosn的博客 写于 ...

  7. 使用openssl模拟CA和CA证书的签发

    使用openssl模拟CA和CA证书的签发     当使用ssl/tls进行加密通信时,必须要有数字证书.若通信只限制在局域网内,可以不向第三方机构申请签发证书,可以通过openssl模拟CA(Cer ...

  8. openssl解析国密X509证书

    openssl解析国密X509证书,把公钥拿出来重写一下就行了        x = strToX509(pbCert, pulCertLen);dwRet = getCertPubKey(x, &a ...

  9. Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护

    Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...

随机推荐

  1. scp复制文件到指定端口

    1.scp基本格式 scp file user@host:/dir 2.scp复制文件到指定端口 scp默认连接的端口是22端口,如果ssh不是使用标准的22端口则使用-P(P大写)指定: scp - ...

  2. Python11/26--mysql之视图/触发器/事务/存储过程

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...

  3. php memcache 基础操作

    <?php/** * Memcache缓存操作 * @author hxm * @version 1.0 * @since 2015.05.04 */class MCache extends O ...

  4. 第四章 javascript的语句、对象笔记摘要

    表达式语句 greeting ="Hello"+name;//赋值语句 i*=3; count++; delete o.x; //删除 alert(greeting); //函数 ...

  5. 我的FP感悟

    FP概要: 我主要总结了以下5点: 函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数... 舍弃语句,拥抱表达式: 表达式就一定有返回值. 无副作用: 不修改外部系统的状态. immut ...

  6. 你不知道的console调试

    概述 浏览器的开发者工具我们经常用,console.log我们也经常用,但是console还有其它一些方便调试的命令,我总结了几个常用的记录在下面,供以后开发时参考,相信对其他人也有用. 获取js执行 ...

  7. C# GroupBy分组的问题和解决

    起因 今天在公司做一个需求的时候,写的是面条代码,一个方法直接从头写到尾,其中用到了GroupBy,且GroupBy的KeySelector是多个属性而不是单个属性. 但是公司最近推行Clean Co ...

  8. Testing - 软件测试知识梳理 - 基础概念

    测试是为了度量和提高被测试软件的质量,对测试软件进行工程设计.实施.维护的的整个生命周期过程. 仅仅发现Bug是测试的初步,而分析出根本原因推动问题的解决,却要有很深的功底. 不同的测试岗位从事不同的 ...

  9. Java 中的伪共享详解及解决方案

    1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的.目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes.在多线程情况下,如果需要修改 ...

  10. EasyNetQ中使用自定义的ISerializer

    最近在使用EasyNetQ时,遇到一个问题:c++项目组发送的消息数据不是Json数据,而是自定义的数据格式(各字段+‘|’连接成一个字符串),EasyNetQ中消费消息接收的都是强类型,没办法直接消 ...