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. Matching Networks for One Shot Learning

    1. Introduction In this work, inspired by metric learning based on deep neural features and memory a ...

  2. Python(四) 列表元组

  3. const和static readonly 区别

    const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值. 而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值. static readonly ...

  4. spoj GSS系列简要题解

    文章目录 GSS1 GSS2 GSS3 GSS4 GSS5 GSS6 GSS7 GSS8 传送门 这个GSSGSSGSS系列全部是跟子段有关的数据结构菜题. 于是来水一篇博客. GSS1 传送门 题意 ...

  5. iOS安装包瘦身的那些事儿

    在我们提交安装包到App Store的时候,如果安装包过大,有可能会收到类似如下内容的一封邮件: 收到这封邮件的时候,意味着安装包在App Store上下载的时候,有的设备下载的安装包大小会超过100 ...

  6. php安装扩展的几种方法

    转自:http://doc3.workerman.net/appendices/install-extension.html 安装扩展 注意 与Apache+PHP或者Nginx+PHP的运行模式不同 ...

  7. 漏洞应急响应之批量poc验证

    1.文章难易度 [★★★] 2.文章知识点: python,poc验证; 3.文章作者: 野驴 4.本文参与 i春秋学院原创文章奖励计划,未经许可禁止转载! 0x01前言 当互联网爆出高危漏洞,或者团 ...

  8. Java 虚拟机的内存结构

    Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的J ...

  9. dubbo rpc调用,接收到的bean为null原因?

    前几天对接公司内部其他部门的系统,用dubbo调用,dubbo看起来很简单,但是却让我们调试了好久啊! 下面是调试纪录: 1. 调用该服务时,直接调不通,查看错误为 no provider ? 然后就 ...

  10. U-boot中SPL功能和源码流程分析

    在U-boot目录下,有个比较重要的目录就是SPL的,SPL到底是什么呢?为什么要用它呢? SPL(Secondary programloader)是uboot第一阶段执行的代码.主要负责搬移uboo ...