详解如何使用openssl创建自签名证书

目录
  • 概览&证书的结构&证书验签
  • 创建根证书
    • 创建根密钥 ca.key.pem
    • 创建根证书 ca.crt.pem
    • * 创建根证书 ca.csr.pem ca.crt.pem
    • 查看根证书
  • 创建服务器证书
    • 创建服务器密钥 server.key.pem
    • 配置文件server.ini
    • 生成服务器端证书==请求文件== server.csr.pem
    • 生成服务器端证书 server.crt.pem
    • 查看服务器端请求文件

概览&证书的结构&证书验签

创建根证书

创建根密钥 ca.key.pem

$ openssl genrsa -des3 -out ca/ca.key.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.........................................................................................................................................................................++++
..........................................................++++
e is 65537 (0x010001)
Enter pass phrase for ca.key.pem:
Verifying - Enter pass phrase for ca.key.pem:

密码 123456

我们在这儿使用 RSA 4096, 因为根证书不经常使用,为了更好的安全性,我们使用较大的参数。

备注

生产环境一般都会有中间证书,我们这儿为了方便省略了中间证书的签发流程

-des         使用des cbc模式对私钥文件进行加密。
-des3         使用des3 cbc模式对私钥文件进行加密。  需要输入密码,秘钥使用需要输入密码
-idea         使用idea cbc模式对私钥文件进行加密
-out          指定输出私钥文件名。

创建根证书 ca.crt.pem

可以不用创建ca.csr.pem文件,直接生成ca.crt.pem文件,如果分成两步,见下一小节

现在我们使用刚创建的根密钥来创建我们的根证书:

$ openssl req -key ca/ca.key.pem -new -x509 -days 3650 -sha256 -out ca/ca.crt -subj '/C=CN/ST=ShanDong/CN=demo.toolbox/O=dzb'
Enter pass phrase for ca.key.pem:

req大致有3个功能:生成证书请求文件、验证证书请求文件和创建根CA

-config
-key     指定私钥
-new
-sha256  哈希函数
-out     输出的文件
-days    有效期
-subj
subj子参数详解:
缩写	翻译	     英文对照
C	 国家名称缩写	Country Name (2 letter code)
ST	 州或省名称	State or Province Name (full name)
L	 城市或区域称	Locality Name (eg, city)
O	 组织名(或公司名)	Organization Name (eg, company)
OU	 组织单位名称(或部门名)	Organizational Unit Name (eg, section)
CN	 服务器域名/证书拥有者名称	Common Name (e.g. server FQDN or YOUR name)
emailAddress	邮件地址	Email

ca.crt的后缀名不加pem,是方便证书安装的时候,系统可以识别,后续的crt不需要安装,所以添加pem后缀,以区分格式

* 创建根证书 ca.csr.pem ca.crt.pem

$ openssl req -new -key ca/ca.key.pem -sha256 -out ca/ca.csr.pem -subj '/C=CN/ST=ShanDong/CN=demo.toolbox/O=dzb'
Enter pass phrase for ca.key.pem:
$ openssl x509 -req -days 3650 -in ca/ca.csr.pem -signkey ca/ca.key.pem -out ca/ca.crt

查看根证书

查看我们刚刚创建的根证书:

$ openssl x509 -noout -text -in ca/ca.crt

主要检查上面 -subj 填写的内容和证书的有效期

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            71:34:01:05:eb:4b:f7:8c:09:c6:b0:ad:34:b4:aa:03:93:2b:fc:d8
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Validity
            Not Before: Apr 24 02:08:43 2023 GMT
            Not After : Apr 21 02:08:43 2033 GMT
        Subject: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:a7:cb:bb:f2:58:8b:17:60:6d:e3:c8:3f:ed:72:
                      ... ...
                    73:ad:e1:de:d0:5b:d2:1d:3e:0c:55:a3:aa:b5:0c:
                    28:8c:b7
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                FE:D8:0D:72:BE:7B:21:48:1F:14:27:85:3C:9D:16:9E:25:D1:3B:4A
            X509v3 Authority Key Identifier:
                keyid:FE:D8:0D:72:BE:7B:21:48:1F:14:27:85:3C:9D:16:9E:25:D1:3B:4A
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         24:1e:d8:40:7b:0e:3b:4b:96:51:ff:cb:a0:62:ba:e5:e9:55:
           ... ...
         a2:ba:44:ac:97:da:dc:24:d9:b7:5f:3a:fa:05:16:b8:2f:9e:
         7a:45:89:fa:be:cf:e4:4e

创建服务器证书

现在让我们使用上面创建的根证书,创建一个我们可以使用的 https 证书。

创建服务器密钥 server.key.pem

$ openssl genrsa -des3 -out server/server.key.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................................................+++++
................................+++++
e is 65537 (0x010001)
Enter pass phrase for server.key.pem:
Verifying - Enter pass phrase for server.key.pem:

密码 123456

备注

我们使用 2048 位的 RSA 证书是因为服务器证书会经常使用,这样可以降低CPU的压力,而且并不影响安全性。

配置文件server.ini

cat > server/server.ini <<EOF
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
[ req_distinguished_name ]
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1  = localhost
IP.1   = 127.0.0.1
IP.2   = 169.254.4.58
IP.3   = 172.20.10.2
EOF

DNS可以配置多个

如果只对IP进行签名,可以如下配置(如果要修改IP,就从这之后进行就行)

cat > server.ini <<EOF
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext
[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = ShangHai
stateOrProvinceName_default = ShangHai
localityName                = Locality Name (eg, city)
localityName_default        = ShangHai
organizationName            = Organization Name (eg, company)
organizationName_default    = dai
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = server.toolbox
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
IP      = 169.254.4.58
EOF

DNS可以配置多个(对应多个域名),IP也可以配置多个

生成服务器端证书==请求文件== server.csr.pem

$ openssl req -sha256 -new -key server/server.key.pem -config server/server.ini -out server/server.csr.pem -subj '/C=CN/ST=ShangHai/CN=server.toolbox/O=dai'
$ openssl req -sha256 -new -key server/server.key.pem -config server/server.ini -out server/server.csr.pem

第一种方式,通过 -subj配置了证书授权对象的信息

第二种方式,通过配置文件确定,在执行过程中,会要求确认,可以在这个过程中进行修改

生成服务器端证书 server.crt.pem

openssl x509 -req -days 3650 \
  -CA ca/ca.crt -CAkey ca/ca.key.pem -CAcreateserial \
  -in server/server.csr.pem -out server/server.crt.pem\
  -extensions req_ext -extfile server/server.ini

一定要加-extfile server/server.ini否则最后签发的证书内不会有IP和域名的信息

查看服务器端请求文件

$ openssl x509 -noout -text -in server/server.crt.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            61:79:bd:82:c8:1e:2a:27:6f:a9:34:c8:92:f8:54:3f:22:de:80:0b
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = ShanDong, CN = demo.toolbox, O = dzb
        Validity
            Not Before: Apr 24 02:19:50 2023 GMT
            Not After : Apr 21 02:19:50 2033 GMT
        Subject: C = CN, ST = ShangHai, CN = server.toolbox, O = dai
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b1:de:96:bb:43:4b:fb:46:99:7e:be:61:c1:46:
                      ... ...
                    4a:18:24:b3:79:8c:ff:35:d1:3a:4e:a3:11:02:2c:
                    98:ff
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:localhost, IP Address:127.0.0.1, IP Address:169.254.4.58, IP Address:172.20.10.2
    Signature Algorithm: sha256WithRSAEncryption
         07:c8:2a:e0:e7:14:86:23:3b:72:38:7f:f8:cc:90:54:f2:fa:
           ... ...
         c2:82:8a:2f:c0:a3:42:78:91:45:92:73:a4:aa:f2:ca:c1:5a:
         58:c0:41:f0:ea:65:43:9e

要检查授权的DNS和IP

以上就是详解如何使用openssl创建自签名证书的详细内容,更多关于openssl创建自签名证书的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解C++中OpenSSL动态链接库的使用

    在上一篇文章 OpenSSL动态链接库源码安装 中我们介绍了如何在Windows和Linux环境中编译OpenSSL动态链接库,这篇文章我们将介绍如何在C代码中引用OpenSSL动态链接库. 测试代码 以下测试代码 main.c 将分别在Windows和Linux环境中编译,该代码的作用是计算给定文件的SHA256值, #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &q

  • Java读取OpenSSL生成的PEM公钥文件操作

    JDK8的JCE是不支持读取PEM文件的.需要使用bouncycastle. 项目需求,使用SHA1WithRSA算法,对接口数据做签名. 代码如下: @Service class SignService { private static Logger LOG = LoggerFactory.getLogger(SignService.class); @Autowired private Config config; private Signature signature; @PostConst

  • OpenSSL生成v3证书方法及配置文件详解

    目录 场景 方法 场景 业务需要生成v3版的证书,而一般使用OpenSSL生成证书时都是v1版的,不带扩展属性. 方法 在使用CA证书进行签署证书时加入-exfile和-extensions选项,具体命令如下: openssl x509 -req -days 365 -sha256 -extfile openssl.cnf -extensions v3_req -in server.csr -signkey server.key -out server.crt 对应openssl.cnf配置文件

  • OpenSSL动态链接库源码安装教程

    Openssl 是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能.调用Openssl的函数就可以实现一个SSL加密的安全数据传输通道,从而保证客户端和服务器之间数据的安全. OpenSSL整个软件包大概可以分成三个主要的功能部分:SSL协议库.应用程序以及密码算法库.OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的.作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协

  • Linux环境下生成openssl证书注意细节介绍

    一.环境:CentOS7,Openssl1.1.1k. 二.概念: 根证书:是生成服务器证书和客户端证书的基础,也可以叫自签发证书,即CA证书 服务器证书:由根证书签发,配置在服务器. 客户端证书:由根证书签发,配置在客户端.也可以配置在web服务器,安装在浏览器. 对称加密:用一个密码加密文件,然后解密也用同样的密码. 非对称加密:加密用的一个密码,而解密用另外一组密码.包括以下两种情况: 用于加密数据时:公钥加密,私钥解密 用于文件签名时:私钥签名,公钥验签 三.步骤: 1.查看openss

  • nginx结合openssl实现https的方法

    在未使用SSL证书对服务器数据进行加密认证的情况下,用户的数据将会以明文的形式进行传输,这样一来使用抓包工具是可以获取到用户密码信息的,非常危险.而且也无法验证数据一致性和完整性,不能确保数据在传输过程中没被改变.所以网站如果有涉及用户账户等重要信息的情况下通常要配置使用SSL证书,实现https协议. 在生产环境中的SSL证书都需要通过第三方认证机构购买,分为专业版OV证书(浏览器地址栏上不显示企业名称)和高级版EV(可以显示企业名称)证书,证书所保护的域名数不同也会影响价格(比如只对www认

  • python openssl模块安装及用法

    小编曾经有过这样的经历,就是在安装使用django框架时候,遇到了部分模块不能够使用,检查了很久,才发现是因为版本问题,需要重新编译安装一个模块版本.这个模块就是我们今天要说的 openssl模块,给大家来一个高瞻远瞩,先让大家掌握住怎么去安装 openssl模块,方便大家日后碰到类似问题,可以得到有效解决. 第一步.下载openssl模块 wget tar -zxvf openssl-1.1.1a.tar.gz cd openssl-1.1.1a 第二步.安装openssl模块 ./confi

  • 详解如何使用openssl创建自签名证书

    目录 概览&证书的结构&证书验签 创建根证书 创建根密钥 ca.key.pem 创建根证书 ca.crt.pem * 创建根证书 ca.csr.pem ca.crt.pem 查看根证书 创建服务器证书 创建服务器密钥 server.key.pem 配置文件server.ini 生成服务器端证书==请求文件== server.csr.pem 生成服务器端证书 server.crt.pem 查看服务器端请求文件 概览&证书的结构&证书验签 创建根证书 创建根密钥 ca.key.

  • 详解MyBatis Generator自动创建代码(dao,mapping,poji)

    连接的数据库为SQL server2008,所以需要的文件为sqljdbc4.jar 使用的lib库有: 在lib库目录下新建一个src文件夹用来存放生成的文件,然后新建generatorConfig.xml 里面代码为: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

  • 详解idea文件右键创建New没有Create New Servlet的解决办法

    第一步 第一步先看看 pom.xml 文件中有没有相关的依赖,需要在dependencies中添加Tomcat中关于jsp和servlet的jar. <dependencies> <!--看看有没有下面的这两个依赖 --> <!--看看有没有下面的这两个依赖 --> <!--依赖1 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jav

  • 详解jvm对象的创建和分配

    对象的创建 创建方式 1. new 关键字直接创建. new ObjectName(). 2.通过 Class 反射对象的 newInstance() 方法.ObjectName  obj  =  ObjectName.class.newInstance(). 3.通过 Class 反射对象获取 Constructor 类,再调用其 newInstance() 方法. ObjectName obj = ObjectName.class.getConstructor.newInstance().

  • 详解SpringBoot项目的创建与单元测试

    前言   Spring Boot 设计之初就是为了用最少的配置,以最快的速度来启动和运行 Spring 项目.Spring Boot使用特定的配置来构建生产就绪型的项目. Hello World 1.可以在 Spring Initializr上面添加,也可以手动在 pom.xml中添加如下代码∶ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>Spring-boot-s

  • 详解Java线程的创建及休眠

    一.进程vs线程 1.进程是系统分配资源的最小单位:线程是系统调度的最小单位 2.一个进程中至少要包含一个线程 3.线程必须要依附于继承,线程是进程实质工作的一个最小单位 二.线程的创建方式 继承Thread类 实现线程的创建(2种写法) 1种写法 public class ThreadDemo03 { static class MyThread extends Thread{ @Override public void run(){ System.out.println("线程名称:"

  • 详解在Python中创建条形图追赶动画

    目录 前言 方法一:使用pause()函数 方法二:使用FuncAnimation()函数 线性图动画 Python中的条形图追赶动画 Python中的散点图动画: 条形图追赶的水平移动 前言 动画是使可视化更具吸引力和用户吸引力的好方法.它帮助我们以有意义的方式展示数据可视化.Python 帮助我们使用现有的强大 Python 库创建动画可视化.Matplotlib是一个非常流行的数据可视化库,通常用于数据的图形表示以及使用内置函数的动画. 使用 Matplotlib 创建动画有两种方法: 使

  • linux 系统进程管理工具systemd详解(systemctl命令、创建自己的systemd服务)

    目录 linux systemd 什么是 systemd systemd 特点 unit(单元) systemd unit目录 Unit 和 Target Unit 文件结构 Linux命令——systemctl 参考 linux systemd 什么是 systemd Linux 系统在启动过程中,内核完成初始化以后,由内核第一个启动的程序便是 init 程序,路径为 /sbin/init(为一个软连接,链接到真实的 init 进程),其 PID 为1,它为系统里所有进程的“祖先”,Linux

  • 详解Android App中创建ViewPager组件的方法

    现在很多app一打开就是一个ViewPager,然后可以用手指滑,每滑一次就换一张图,底下还会有圈圈表示说现在滑到第几章~ 通常这些图片都是放功能简介或是使用教学之类的,我的需求很简单,就是上面提到的那样而已. 有两种做法,一种是找现有套件,查了一堆资料每个都跟我推荐ViewPagerIndicator这套,我之前也看过这套,只是看起来需要有fragment再加上google play范例好像载不到了,所以只好自己实做一个. Viewpager的实作可参考Android ViewPager使用详

  • 详解Node.js 中使用 ECDSA 签名遇到的坑

    最近有个朋友问我关于 Node.js 下使用 ECDSA 的问题,主要是使用 Node.js 的 Crypto 模块无法校验网络传输过来的签名结果.在踩坑无数后,终于搞清楚了原因. 坑 0x00:签名输出格式 在排除了证书.消息不一致的可能之后,我开始对比使用 Node.js 签名的结果与网络传输过来的签名,发现长度不一致,大约差了5~7个字节.于是去网上搜索了一下,才知道原来 Node.js (基于 OpenSSL)签名得到的是 DER 格式的内容,而网络上常用的 ECDSA 签名结果是 IE

随机推荐