https学习笔记三----OpenSSL生成root CA及签发证书

在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的。这一章,主要介绍下如何使用openssl库来创建key file,以及生成root CA及签发子证书。学习主要参考官方文档:https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html#

一、openssl 简介

openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。官网:https://www.openssl.org/source/,其中有3个主要的用途:1、密码算法库(建立 RSA、DH、DSA key 参数,计算消息摘要,使用各种 Cipher加密/解密) 2、密钥和证书封装管理功能(建立 X.509 证书、证书签名请求(CSR)和CRLs(证书回收列表));3、SSL通信API接口(SSL/TLS 客户端以及服务器的测试,处理S/MIME 或者加密邮件)。

二、安装openssl(linux CentOS7 32位)

如果使用的是unix操作系统,可能安装系统的时候,这个库就已经有且存在了。但是在使用前,需要注意下当前openssl的库的版本。

openssl version
OpenSSL 1.0.1 14 Mar 2012

因为版本1.0.1是一个很重要的风水岭版本。因为1.0.1是第一个支持TLS1.1和1.2的版本。支持新的协议。操作系统的选择也很重要,比如Ubuntu 12.04 LTS,客户端不支持SSL2。这里安装以CentOS7系统为例:

A、 下载openssl库文件:https://www.openssl.org/source/

B、将下载的压缩包放在根目录下,解压缩,进入解压缩文件(得到openssl-openssl-1.0.0文件夹)cd openssl-1.0.0

C、编译前配置openssl,执行命令:./config --prefix=/usr/local/openssl,其中 ( --prefix )参数为欲安装之目录,也就是安装后的档案会出现在该目录下。

D、编译openssl,执行命令: make install

小插曲:安装openssl报错

1、问题描述:安装完成,查看版本信息的时候报错了,缺少一个库文件libssl.so.1.1。
[[email protected] /usr/local/openssl/bin]# openssl version
      openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared 

object file: No such file or directory2、解决方法有依赖没装libssl。在/etc/ld.so.conf文件中写入openssl库文件的搜索路径,使用修改后的conf生效即可:
echo "/usr/local/lib64" >> /etc/ld.so.conf
ldconfig -v

三、使用openssl生成RSA密钥对

使用openssl的私钥产生公钥前,需要了解以下几点:

1、key算法:openssl 支持生成RSA,DSA,ECDSA的密钥对,但是RSA是目前使用最普遍的。

2、Key长度:RSA的2048是公认较比较安全的key长度。

3、密码(Passphrase):在key上使用密码是一个可选值,但是一般都是强烈建议的(官网这样写的,实际项目中很多都没有设置口令),这样每次使用key文件时,都需要输入这个密码才能使用,增强了其安全性,但是随之而来的易用性也会变差。

使用genrsa命令来生成RSA key( 产生DSA其他算法的key文件,可以直接参考学习官网教程,在此处以常用的为例),2步骤能完成:

A、生成私钥:

使用命令:openssl genrsa -aes128 -out fd.key 2048 。以下输入了为这个key值设置了密码,且密码使用aes128加密保存。

openssl genrsa -aes128 -out fd.key 2048
Generating RSA private key, 2048 bit long modulus
....+++
...................................................................................+++
e is 65537 (0x10001)
Enter pass phrase for fd.key: ****************
Verifying - Enter pass phrase for fd.key: ****************

这个key文件就是私钥文件。可以查看下文件内容:

 cat fd.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,01EC21976A463CE36E9DB59FF6AF689A

vERmFJzsLeAEDqWdXX4rNwogJp+y95uTnw+bOjWRw1+O1qgGqxQXPtH3LWDUz1Ym
mkpxmIwlSidVSUuUrrUzIL+V21EJ1W9iQ71SJoPOyzX7dYX5GCAwQm9Tsb40FhV/
[21 lines removed...]
4phGTprEnEwrffRnYrt7khQwrJhNsw6TTtthMhx/UCJdpQdaLW/TuylaJMWL1JRW
i321s5me5ej6Pr4fGccNOe7lZK+563d7v5znAx+Wo1C+F7YgF+g8LOQ8emC+6AVV
-----END RSA PRIVATE KEY-----       

B、生成公钥:

使用命令:openssl rsa -in fd.key -pubout -out fd-public.key

openssl rsa -in fd.key -pubout -out fd-public.key
Enter pass phrase for fd.key: ****************

查看这个key文件,就是公钥:

 cat fd-public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnlccwQ9FRyJYHM8sFNsY
PUHJHJzhJdwcS7kBptutf/L6OvoEAzCVHi/m0qAA4QM5BziZgnvv+FNnE3sgE5pz
iovEHJ3C959mNQmpvnedXwfcOIlbrNqdISJiP0js6mDCzYjSO1NCQoy3UpYwvwj7
0ryR1F+abARehlts/Xs/PtX3VamrljiJN6JNgFICy3ZvEhLZEKxR7oob7TnyZDrj
IHxBbqPNzeiqLCFLFPGgJPa0cH8DdovBTesvu7wr/ecsf8CYyUCdEwGkZh9DKtdU
HFa9H8tWW2mX6uwYeHCnf2HTw0E8vjtOb8oYQxlQxtL7dpFyMgrpPOoOVkZZW/P0
NQIDAQAB
-----END PUBLIC KEY-----

三、获取权威机构颁发证书步骤

获取权威机构颁发的证书,需要先得到私钥的key文件(.key),然后使用私钥的key文件生成sign req 文件(.csr),最后把csr文件发给权威机构,等待权威机构认证,认证成功后,会返回证书文件(.crt)。

A:生成私钥key。

与第二节使用openssl生成RSA密钥对的步骤A一致。使用命令:openssl genrsa -aes128 -out fd.key 2048

B:私钥的key文件生成sign req 文件(.csr)

生成csr文件时,需要填写一些关于待签人或者公司的一些信息,比如国家名,省份名,组织机构名,主机名,email名,有些信息可以不填写,使用.标识。

使用命令:openssl req -new -key fd.key -out fd.csr。过程如下:

$ openssl req -new -key fd.key -out fd.csr
Enter pass phrase for fd.key: ****************
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) [AU]:GB
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Feisty Duck Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.feistyduck.com
Email Address []:[email protected]

Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

C、把csr文件发给权威机构,等待权威机构认证,交费获取证书即可。

四、OpenSSL生成root CA及签发证书

有时候,使用SSL协议是自己内部服务器使用的,这时可以不必去找第三方权威的CA机构做证书,可以做自签证书(自己创建root CA(非权威))主要有以下三个步骤。

A:创建openssl.cnf在使用default-ca时需要使用的SSL的工作目录(第一次必须要设置)。

1、查看openssl的配置文件:

openssl version -a
OpenSSL 1.0.1e-fips 17 Nov 2016
built on: Fri Nov 18 16:28:23 CST 2016
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic 

2、找到OPENSSLDIR: "/etc/pki/tls"的配置文件openssl.cnf

根据配置文件下的[ CA_default ]节点默认值,创建对应文件夹和文件。

按顺序在/etc/pki/CA下执行以下命令创建文件夹和文件:

其中,certs:存放已颁发的证书;newcerts:存放CA指令生成的新证书;private:存放私钥;crl:存放已吊销的整数;index.txt:penSSL定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的;serial:证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号。

执行完后,当前目录为:

[[email protected] /etc/pki/CA]$ll
total 20
drwxrwxrwx 2 root root 4096 Mar 12 11:08 certs
drwxrwxrwx 2 root root 4096 Nov 18  2016 crl
-rwxrwxrwx 1 root root    0 Mar 12 11:06 index.txt
drwxrwxrwx 2 root root 4096 Nov 18  2016 newcerts
drwxrwxrwx 2 root root 4096 Nov 18  2016 private
-rwxrwxrwx 1 root root   33 Mar 12 11:12 serial
 小插曲:使用自签证书签名用户证书时报错,文件不存在

1、问题描述:

     openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

     Using configuration from /etc/pki/tls/openssl.cnf

/etc/pki/CA/serial: No such file or directory

error while loading serial number
       139996157081440:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘/etc/pki/CA/serial‘,‘r‘)
       139996157081440:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

 2、问题解决:     如果不设置工作目录,后续第三步的最后一小步,使用openssl的ca命令产生用户的ca证书时会报错,创建openssl.cnf在使用default-ca时需要使用的SSL的工作目录即可。

B:生成CA根证书(root ca证书)。

步骤:生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)。

# Generate CA private key   --->ca.key

openssl genrsa -out ca.key 2048

# Generate CSR   --->ca.csr

openssl req -new -key ca.key -out ca.csr

# Generate Self Signed certificate(CA 根证书)  ---> ca.crt

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

小插曲:直接根据key文件获取CA根证书的命令

方法:在得到key文件后,执行以下命令:     openssl req -new -x509 -days 365 -key fd.key -out fd.crt     如果不想填写那些注册信息,执行以下命令:     openssl req -new -x509 -days 365 -key fd.key -out fd.crt subj "/C=GB/L=London/O=Feisty Duck Ltd/CN=www.feistyduck.com

C:用自签根证书 ca.crt  给用户证书签名。

步骤:生成私钥(.key)-->生成证书请求(.csr)-->用CA根证书签名得到证书(.crt)

#  private key  --->server.key

openssl genrsa  -out server.key 1024
# generate csr  --->server.csr

openssl req -new -key server.key -out server.csr 
# generate certificate  --->server.crt 
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
小插曲:用CA根证书签名时报错,The mandatory stateOrProvinceName field was missing
1、问题描述:
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The mandatory stateOrProvinceName field was missing
2、出现原因:openssl.cnf中CA policy有三个match,必须要填一样的,或者改成optional3、解决方法:修改配置文件,修改后为:

# For the CA policy
  [ policy_match ]
  countryName = optional
  stateOrProvinceName = optional
  organizationName = optional
  organizationalUnitName = optional
  commonName = supplied
  emailAddress = optional

D:证书的简单使用。

把server.crt以及server.key保存在服务器端等待程序加载使用;把ca.key保存在客户端,如果客户端需要验证服务器端发的证书时使用。

原文地址:https://www.cnblogs.com/loleina/p/8418111.html

时间: 2025-01-14 03:28:52

https学习笔记三----OpenSSL生成root CA及签发证书的相关文章

VSTO学习笔记(三) 开发Office 2010 64位COM加载项

原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(Automation Executables) 2.Office加载项(COM or Excel Add-In) 3.Office文档代码或模板(Code Behind an Office Document or Template) 4.Office 智能标签(Smart Tags) 本次我们将学习使

NFC学习笔记——三(在windows操作系统上安装libnfc)

本篇翻译文章: 这篇文章主要是说明如何在windows操作系统上安装.配置和使用libnfc. 一.基本信息 1.操作系统: Windows Vista Home Premium SP 2 2.硬件信息: System: Dell Inspiron 1720 Processor: Intel Core 2 Duo CPU T9300 @ 2.5GHz 2.5GHz System type: 32-bit Operating System 3.所需软件: 在windows操作系统上安装软件需要下列

CCNA学习笔记三——STP生成树协议

广播风暴:当网络中存在物理环路,会产生广播风暴 STP协议:Spanning Tree Protocol(生成树协议) 逻辑上断开环路,防止广播风暴的产生 STP算法:(所有选择都是比小-小的当选) 选择根网桥(Root Bridge):在网络中的所有交换机中选择一台 选择依据:网桥ID(网桥优先级+MAC地址) 选择根端口(Root Ports):在所有非根网桥中选择一个 选择依据:(1)根路径成本最低 (2)直连网桥ID最小 (3)端口ID最小 选择指定端口(Designated Ports

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH

Ajax学习笔记(三)

三.jQuery库详解 1.使用jQuery之后,javascript操作的不再是HTML元素对应的DOM对象,而是包装DOM对象的jQuery对象.js通过调用jQuery对象的方法来改变它所包装的DOM对象的属性,从而实现动态更新HTML页面. 由此可见,使用jQuery动态更新HTML页面只需以下两个步骤: (1)获取jQuery对象.jQuery对象通常是DOM对象的包装 (2)调用jQuery对象的方法来改变自身.当jQuery对象被改变时,jQuery包装的DOM对象随之改变,HTM

马哥学习笔记三十——tomcat

Java体系结构包含四个独立却又彼此相关的技术: Java程序设计语言 Java API Java Class文件格式 JVM: Java Virtual Machine JVM的实现方式: 1.一次性解释器,解释字节码并执行: 2.即时编译器(just-in-time complier) 依赖于更多内存缓存解释后的结果 3.自适应编译器 缓存20%左右代码,提高80%左右的速度: 运行时数据区: 线程私有内存区: 程序计数器 java虚拟机栈 线程共享内存区: 方法区 堆:java自动内存回收

angular学习笔记(三十)-指令(2)

本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: E 2. 属性: A 3. 样式类: C 4. 注释: M restrict的值可以是上面四个字母的任意一个或多个的组合. 不指定的话默认为A. 二. replace: 布尔值.是否将指令元素替换,可以有两个值: 1.true: 替换整个使用指令的元素 2.false: 不替换整个使用指令的元素,而

UE4学习笔记(三): 为什么使用C++替代UnrealScript?

原文链接: https://forums.unrealengine.com/showthread.php?2574-Why-C-for-Unreal-4&p=16252&viewfull=1#post16252 之前的三代Unreal引擎中都包括了一种叫UnrealScript的脚本语言, 用它来写游戏玩法简直太方便了, 根本不用去接触复杂的C++引擎. 尽管脚本十分受新手的欢迎, 但它却成为了创新和公布的障碍. 在Unreal引擎成长的过程中, 我们不断地踩到这种坑. 所以在2011年,

angular学习笔记(三十一)-$location(2)

之前已经介绍了$location服务的基本用法:angular学习笔记(三十一)-$location(1). 这篇是上一篇的进阶,介绍$location的配置,兼容各版本浏览器,等. *注意,这里介绍的是基于angular-1.3.2版本的,低版本的$location可能会有问题. hashbang模式和history api创建单页应用 首先,$location是用在单页应用里的...(废话,angular就是用在单页的)...所以,$location处理的是url改变,但是不刷新页面的情况.