概述

OpenSSL是一个多用途的工具, 适用于涉及Public Key Infrastructure(PKI), HTTPS(HTTP over TLS)的用途. 这份文档提供关于OpenSSL命令在常见场景下的使用说明, 包括生成私钥, 证书签名请求, 和证书格式转换.

如何使用

  • 如果您不熟悉证书签名请求(CSRs), 先读第一节

  • 除了第一节, 这份文档以备忘纸条(cheat sheet)的格式编写, 包含对应的命令行

  • 直接查看和问题相关的章节

  • 大多数命令行为了浅显易读, 写成了多行的格式

关于证书签名请求Certificate Signing Requests(CSRs)

如果需要从certificate authority(CA)获取一份SSL证书, 你需要先生成一份certificate signing request(CSR). 一个CSR包含的主要信息是key pair中的公钥, 以及一些附加的信息. 在被签名时这些信息都会被塞进证书.

无论什么时候, 创建一个CSR, 都会提示你输入一些证书相关的信息, 这些信息被称为Distinguished Name(DN). 在DN中最重要的字段就是Common Name (CN), 其内容应当与你将要使用此证书的主机的Fully Qualified Domain Name (FQDN)完全一致. 在创建CSR时可以在命令行中传递信息来跳过交互填写的步骤.

在DN中提供的其他字段是关于你的组织或业务的信息, 如果你从一个certificate authority购买了一份SSL证书, 这些字段例如"Organization"需要和你的机构一致.

下面是一个CSR的信息填写交互的例子

Country Name ( letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

如果你打算避免交互式的填写, 你可以使用 -subj 参数来输入这些信息, 下面是一个例子, 输入的信息和前面交互式的是一样的

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

现在你应该了解CSR的含义了, 可以根据需要查看下面的其他章节

生成CSR

这一节介绍如何使用生成CSR相关的OpenSSL命令(以及生成私钥, 如果还没有私钥的话). CSR可以用来从certificate authority请求SSL证书.

记住你可以用-subj参数来避免交互式填写CSR信息.

从零生成私钥和CSR

如果你打算用HTTPS来增强你的Apache HTTP或Nginx服务器, 并且用一个Certificate Authority(CA)来签发SSL证书, 你需要使用这个. 生成一份CSR然后发送给CA要求其签发一份CA-signed SSL证书. 如果你的CA支持SHA-2, 在参数中添加-sha256来生成SHA-2签名的CSR.

下面的命令用于生成一份2048-bit的私钥(domain.key), 和一份CSR(domain.csr)

openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr

在弹出交互中填写相关信息

-newkey rsa:2048参数用于指定私钥长度为2048bit, 并且使用RSA算法. -nodes参数指定私钥不需要密码加密. -new参数, 这里没使用但是实际上包含了, 用于指定生成CSR.

用现有的私钥生成CSR

如果手里已经有一份私钥了, 要用这个私钥来从CA那里请求证书, 可以用这个方法.

下面的命令用于根据存在的私钥(domain.key)来生成新的CSR(domain.csr)

openssl req \
-key domain.key \
-new -out domain.csr

在弹出交互中填写相关信息

-key参数用于指定现有的用于生成CSR的私钥文件, -new参数用于指定生成CSR.

用现有的私钥和证书生成CSR

如果你手里有私钥, 想续签一个证书, 但是你的CA却找不到原先的CSR了, 这个方法可以省掉你重新输入CSR信息的时间, 会从当前的证书中提取相应的信息.

下面的命令用于根据存在的私钥(domain.key)和证书(domain.crt)生成一个新的CSR(domain.csr)

openssl x509 \
-in domain.crt \
-signkey domain.key \
-x509toreq -out domain.csr

-x509toreq参数用于说明使用的是X509证书来生成CSR

生成SSL证书

如果你需要用SSL证书来加强服务安全性, 但是不想通过CA来签发证书, 一个可行并且免费的方案就是自己签发证书.

可以自己签发的证书就称为自签名证书. 自签名证书表示这个证书是使用自己的私钥来签名的. 自签名证书也可以像CA签发的证书一样, 用来加密数据, 但是你的用户将会看到一个警告, 提示他们这个证书并不是他们的操作系统或浏览器信任的. 因此自签发证书仅适用于你不需要跟用户证明自己身份真实性的场合.

这一节介绍自签名证书相关的OpenSSL命令.

从零生成一个自签名证书

如果你需要用HTTPS来加强Apache HTTP或Nginx的服务安全性, 但是不想通过CA来签发证书, 可以使用这个方法.

下面的命令创建了一个2048bit的私钥(domain.key)和一个自签名证书(domain.crt)

openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-x509 -days 365 -out domain.crt

在弹出交互中填写相关信息

-x509参数用于告诉req要创建一个自签名证书. -days 365参数指定有效期为365天. 一个临时的CSR会同时被创建, 用于收集关联的证书相关的信息.

使用现有的私钥生成自签名证书

如果你手里有私钥, 想用这个私钥来签发一个自签名证书.

下面的命令用现有的私钥(domain.key)生成一个自签名证书(domain.crt)

openssl req \
-key domain.key \
-new \
-x509 -days 365 -out domain.crt

在弹出交互中填写相关CSR信息

-x509参数告诉req要创建一个自签名证书, -days 365参数指定有效期为365天. -new参数用于开启CSR信息填写

使用现有的私钥和CSR生成自签名证书

如果你手里有私钥和CSR, 想通过它们生成一个自签名证书.

下面的命令用于根据现有的私钥(domain.key)和CSR(domain.csr)生成一个新的自签名证书(domain.crt)

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

-days 365参数用于指定有效期为365天.

查看证书

证书和CSR编码是PEM格式, 不是文本, 要通过命令进行查看. 这一节介绍如何使用OpenSSL命令查看PEM编码格式的文件内容.

查看CSR内容

下面的命令用于明文展示CSR(domain.csr)的内容

openssl req -text -noout -verify -in domain.csr

查看证书内容

下面的命令用于明文展示证书(domain.crt)的内容

openssl x509 -text -noout -in domain.crt

校验CA签发的证书

下面的命令用于校验使用CA证书(ca.crt)签发的证书(domain.crt)

openssl verify -verbose -CAFile ca.crt domain.crt

私钥

这一节介绍创建和校验私钥的OpenSSL命令

创建私钥

使用下面的命令创建一个有密码保护的2048bit私钥(domain.key)

openssl genrsa -des3 -out domain.key 2048

过程中需要输入密码

校验私钥

使用下面的命令检查一个私钥(domain.key)是否有效

openssl rsa -check -in domain.key

如果私钥是被加密的, 会弹出提示让输入密码, 如果密码正确, 界面会展示解密后的私钥.

校验私钥是否匹配证书和CSR

使用下面的命令检查私钥(domain.key)是否与证书(domain.crt)和CSR(domain.csr)匹配

openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req -noout -modulus -in domain.csr | openssl md5

如果上面命令的输出是相同的, 说明这三个文件相关的可能性非常高

加密私钥

下面的命令使用一个未加密的私钥(unencrypted.key)生成一个加密的私钥(encrypted.key)

openssl rsa -des3 \
-in unencrypted.key \
-out encrypted.key

过程中需要输入密码

解密私钥

下面的命令使用加密的私钥(encrypted.key)输出解密的私钥(decrypted.key)

openssl rsa \
-in encrypted.key \
-out decrypted.key

过程中需要输入密码

转换证书格式

以上生成的证书都是ASCII PEM编码的X.509证书. 实际使用中存在多种编码格式和容器类型的证书, 各种应用有各自使用的证书类型, 而很多证书会在同一个文件里包含多种类型的信息例如私钥, 证书, CA证书.

OpenSSL可以用于在多种证书格式之间进行转换. 这一节介绍一些常用的转换.

PEM 转换至 DER

下面的命令用于将PEM编码的证书(domain.crt)转换为DER编码的二进制格式证书(domain.der)

openssl x509 \
-in domain.crt \
-outform der -out domain.der

DER格式主要用于Java

DER 转换至 PEM

下面的命令用于将DER编码的证书(domain.der)转换为PEM编码证书(domain.crt)

openssl x509 \
-inform der -in domain.der \
-out domain.crt

PEM 转换至 PKCS7

下面的命令用于将PEM编码的证书(domain.crt and ca-chain.crt) 添加到PKCS7文件(domain.p7b):

openssl crl2pkcs7 -nocrl \
-certfile domain.crt \
-certfile ca-chain.crt \
-out domain.p7b

注意你可以使用一个或多个-certfile参数指定需要添加到PKS7文件的证书.

PKCS7文件, 也称P7B, 常使用于Java Keystores和Microsoft IIS (Windows). 是一种ASCII格式的文件, 可以包含证书和CA证书.

PKCS7 转换至 PEM

Use this command if you want to convert a PKCS7 file (domain.p7b) to a PEM file:

openssl pkcs7 \
-in domain.p7b \
-print_certs -out domain.crt

Note that if your PKCS7 file has multiple items in it (e.g. a certificate and a CA intermediate certificate), the PEM file that is created will contain all of the items in it.

PEM 转换至 PKCS12

Use this command if you want to take a private key (domain.key) and a certificate (domain.crt), and combine them into a PKCS12 file (domain.pfx):

openssl pkcs12 \
-inkey domain.key \
-in domain.crt \
-export -out domain.pfx

You will be prompted for export passwords, which you may leave blank. Note that you may add a chain of certificates to the PKCS12 file by concatenating the certificates together in a single PEM file (domain.crt) in this case.

PKCS12 files, also known as PFX files, are typically used for importing and exporting certificate chains in Micrsoft IIS (Windows).

PKCS12 转换至 PEM

Use this command if you want to convert a PKCS12 file (domain.pfx) and convert it to PEM format (domain.combined.crt):

openssl pkcs12 \
-in domain.pfx \
-nodes -out domain.combined.crt

Note that if your PKCS12 file has multiple items in it (e.g. a certificate and private key), the PEM file that is created will contain all of the items in it.

OpenSSL 版本

openssl version命令可以用于检查当前使用的OpenSSL版本, 以及编译时使用的参数. 这些会影响到实际能使用的功能.

下面的命令用于展示版本和编译参数信息

openssl version -a

上面的文档使用的OpenSSL参数为:

OpenSSL 1.0.1f  Jan
built on: Mon Apr :: UTC
platform: debian-amd64
options: bn(,) rc4(16x,int) des(idx,cisc,,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size= -Wformat -Werror=format-security -D_FORTIFY_SOURCE= -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -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: "/usr/lib/ssl"

结束语

以上的内容基本覆盖了大部分使用OpenSSL处理SSL证书的功能, 除此以外, OpenSSL还有很多其他的功能未介绍.

OpenSSL的证书, 私钥和签名请求(CSRs)的更多相关文章

  1. openssl数字证书私钥删除私钥密码

    解密 openssl rsa -in server.key.org -out server.key

  2. windows下OpenSSL加密证书安装步骤与使用方法

    OpenSSL加密证书一般用于签名认证,含私钥和公钥.在Linux系统中,OpenSSL一般是已经安装好了,可以直接使用.而在Windows系统中,是需要安装使用的. 最近在使用支付平台时,用到了Op ...

  3. OpenSSL与公钥私钥证书签名的千丝万缕

    导语 人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透. 介绍 OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Publi ...

  4. openssl生成证书及签名

    第一步,生成私钥 $ openssl genrsa -out privatekey.pem 2048 查看生成的私钥内容 $ file privatekey.pem privatekey.pem: P ...

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

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

  6. [Apple开发者帐户帮助]三、创建证书(7)创建证书签名请求

    Mac上的Keychain Access允许您创建证书签名请求(CSR). 启动位于的Keychain Access /Applications/Utilities. 选择Keychain Acces ...

  7. OpenSSL 下载和私钥证书、CERTIFICATE证书生成

    openssl 是生成私钥和公钥证书的重要工具. Windows如何安装OpenSSL: 官网:https://www.openssl.org/community/mailinglists.html  ...

  8. 使用 openssl 生成证书

    一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...

  9. openssl数字证书常见格式与协议介绍

    原文地址:http://blog.csdn.net/anxuegang/article/details/6157927 证书主要的文件类型和协议有: PEM.DER.PFX.JKS.KDB.CER.K ...

随机推荐

  1. 【转】高性能网络编程7--tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...

  2. 详解Linux获取启动盘路径命令--fdisk、sfdisk -l、lsblk

    概述 linux引导磁盘路径可以用于任何问题的故障诊断.这个引导分区或路径包含GRUB配置的Linux引导装载程序.那么我们可以怎么找到当前Linux引导磁盘路径呢? 基本上有三种方法可以找到当前Li ...

  3. pyecharts绘制map地图

    pyecharts的安装和地图库的安装可以参照 geo绘图:https://www.cnblogs.com/qi-yuan-008/p/12025123.html 直接进入 python的具体使用阶段 ...

  4. beta版本——第四次冲刺

    第四次冲刺 (1)SCRUM部分☁️成员描述: 姓名 李星晨 完成了哪个任务 进行注册的时候若不输入手机号,提醒用户的是未输入登录名,进行更改 花了多少时间 1.2h 还剩余多少时间 1.8h 遇到什 ...

  5. selenium常用的API(七)判断元素是否可见

    web页面不可见的元素虽不在页面上显示,但是存在于DOM树中,这些元素webdriver也能找到. element.is_displayed()方法可以判断元素是否在页面上显示,如果显示返回True, ...

  6. 格式化字符串——初级% 和format

    print '{a},{b}'.format(a='hello',b='word') st='a %s %s x y z' st1=('b','c') print st%st1 print '%s % ...

  7. html5添加视频为背景自动播放

    客户想做个打开官网自动播放一段视频,楼主使用了video标签,即下面的代码:: 于是我在video标签上添加了属性 autoplay=“autoplay” loop=“loop” 然而通过地址栏进去的 ...

  8. spark中的scalaAPI之RDDAPI常用操作

    package com.XXX import org.apache.spark.storage.StorageLevel import org.apache.spark.{SparkConf, Spa ...

  9. linux下使用rzsz实现文件的上传和下载

    新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz ...

  10. gulp-htmlmin 页面压缩插件 gulp插件 参数说明

    gulpfile.js var gulp = require('gulp'), htmlmin = require('gulp-htmlmin'); gulp.task('testHtmlmin', ...