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

导语

人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透。

介绍

OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Public Key Infrastructure)即:公钥基础建设、HTTPS(HTTP以及TLS)等相关的技术。这篇提纲挈领式的随笔文章可以提供快速的OpenSSL相关技术的命令咨询,这对于IT软件开发技术人员的日常工作来说非常的有必要。

这里主要包含了OpenSSL的一些例子,有:如何生成私钥(private key)、CSR(certificate signing requests)、如何生成证书(certificate)、以及如何对他们进行格式转换,这里当然只是一部分OpenSSL的最常用法了...

如何使用本文

  • 如果你不熟悉CSR,证书签名请求(certificate signing request),那么请从正文第一部分开始阅读
  • 除去第一部分,本文将会类似于命令行文档的形式进行介绍
  • 当你非常熟悉了解这些OpenSSL的基本技术知识之后,你可以随时随地直接查看你想要查看的正文部分,以备不时之需

什么是Certificate Signing Requests (CSRs)

如果你想获得一个经过certificate authority (CA)认证的SSL certificate,那么你必须首先生成或者持有一个certificate singning request(CSR证书签名请求,下文我将不再赘述中文)。一个CSR主要由一对公钥私钥中的public key、以及一些额外信息构成。

注意:CSR是由public key和一些类似公司明、国家、地区、省市的信息,两者构成,其中公钥还对应一个私钥,也就是说CSR的产生必须依赖一对公钥私钥。

任何时候你生成一个CSR,都会被提示并要求提供一些关于证书的信息,这些信息是公开的就像你的工牌一样作为你的唯一DN(Distinguised Name,识别名)。这些信息里面一个最重要的信息就是Comman Name(CN),这个信息是用来非常准确地描述该CSR所要产生的certificate的证书发布方的信息,这个信息全程Fully Qualified Domain Name(FQDN),通俗点解释:有一个https的服务器我假设它是大学,有一个CSR我把它比作学校教务处的章子,有个certificate我把它比作软件工程专业的毕业证书,章子上面有学校的最权威的信息,那么就很清楚了。对吧?

继续,当使用命令行生成CSR的时候会有FQDN的IO交互输入过程,当然你通过一路回车可以跳过这些输入的步骤从而生成一个全是空格信息的CSR。

另外,还有一条FQDN中比较中要的DN是关于提供你的公司信息、或者组织信息,如果你正在为你的老板开发一款应用或者产品并且被要求使用SSL证书认证机制,那么你就不能一路回车的方式生成CSR了,什么是组织信息?给举个例子:

---
Country Name (2 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 []:

如果你不像一个接着一个在控制台回答OpenSSL的csr生成输入交互,那么就使用下面一段代码一笔带过:

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

现在,你应该灰常明白CSR是什么了吧?如果还不太明白再回头看一边

如何生成CSR

前面说了,CSR里面包含了一个公钥、和QFDN,因此首先你得有一个公钥,如果没有你就要生成一个,但实际上公钥是由私钥生成的,可以这么理解:公钥是露在外头的萝卜茎叶、私钥是埋在土里的萝卜,要拿到公钥肯定得有萝卜啊⊙﹏⊙、

生成一个Private Key(私钥)和对应的CSR

如果你想使用HTTPS(HTTP之上的TLS)来加密您的Apache HTTP或者Nginx web server,并且你希望使用Certificate Authority (CA) 技术来处理SSL certificate证书,那么就可以使用以下方式产生CSR。这些通过此种方式产生的CSR可以被发送到一个CA机制里,用来请求通过CA认证并获得一个CA-signed SSL certificate(CA 认证的签名文件),如果你的CA机制支持SHA-2话增加-sha256这个选项参数到下面的命令行,这个参数项可以用SHA-2算法给你要生成的CSR进行签名。

下面的命令行生成一个2048-bit的private key(domain.key)以及一个CSR(domain.csr):

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

紧接着通过控制台的交互来输入你的QFDN信息,然后直至完成

注意:-newkey rsa:2048 这个参数项是用来指定这个这个private key生成的是2048-bit的结果,并且使用RSA算法。-nodes 这个参数项是用来指定private key不需要使用密码加固。

用已有的private key(私钥)来生成CSR

使用下面的方式来生成一个CSR,这个命令使用一个已存在的private key (domain.key)生成一个CSR(domain.csr):

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

回答控制台的交互输入直到完成CSR生成。

注意:-key 这个参数项是用来指定一个已存在的private key的位置。-out这个指示csr文件产生的位置及名称

用已存在的证书和私钥生成CSR

你必须清楚的是:CSR是证书发布方使用私钥+QFDNCSR产生的,CSR文件的内容由公钥+QFDN构成,证书是由CSR经过签名后颁发给证书持有方的。因此,通过一系列的算法是可以从证书里使用私钥算出CSR来,这就像是学校教务处收回了你的毕业证书抠掉你的照片和其他信息还原回来就是CSR了,CSR就等于是一个证书空壳子。

使用下面命令来创建一个新的CSR(domain.csr),当然它是基于已存在的certificate(domain.crt)以及你的private key(domain.key):

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

参数项 -x509toreq 用来表示使用一个X509类型的证书格式产生CSR。

生成一个SSL证书

如果你不想产生一个需要CA认证的证书,那么你就必须自己给这个证书签名,啊啊啊?什么意思?说形象点,你犯校规被拒绝颁发毕业证书,为了蒙骗你爹妈你自己给自己盖了个冒牌的章子,就这么理解。

一个可以正确被你自己识别证书当然可以是你自己签名的证书,这就等于你自己造了个冒牌毕业证书,你当然自己得首先相信它是个ok的证书咯,我们为这样的证书起名self-signed certificate(自签名证书)。self-signed certificate可以用来给你的数据加密,它的效果跟使用CA-signed的效果是一样的,不过当你把这样的证书加密的数据放到浏览器或者其他终端的时候会产生warning,最常见的就是在chrome浏览器力弹出提示说该站点不安全什么什么的,因为它未经过不再CA-signed列表里,如果你想让别的用户正常浏览有两种途径,一个是把证书颁发给用户并让用户导入该证书到浏览器或者其他终端应用,第二个就是交给CA授权认证(个人和小公司就算了吧)

下面这个章节主要讲述 self-signed certificates的细节

生成一个 self-signed certificates(自签名的证书)

使用下面的方式来生成一个自签名的证书,如果你将准备使用它来加密你的Apache HTTP 或者 Nginx web server,并且你确定你不需要使用CA认证的certificate。

下面的命令用来生成一个2048-bit的private key(domain.key)以及 self-signed certificate (domain.crt) :

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

回答控制台CSR的相关信息直到CSR生成完毕。

参数项 -x509 告诉req子命令创建一个自签名的证书,-days 365 这个参数项用来指定证书的有效时间为从现在开始的365天之后,一个中间临时产生的CSR文件将会连同上述信息一并出现,当然这很正常。

使用一个已存在的私钥生成一个self-signed certificate(自签名证书)

使用下面的方式生成一个自签名证书,当然前提是你已经拥有一个私钥。

使用下面的命令基于private key (domain.key)产生一个self-signed certificate (domain.crt) :

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

回答控制台CSR的相关信息直到CSR生成完毕。

参数项 -x509 告诉req子命令创建一个自签名的证书,-days 365 这个参数项用来指定证书的有效时间为从现在开始的365天之后,-new 用来激活CSR 信息询问交互

使用已存在的私钥和CSR来生成self-signed certificate(自签名证书)

使用这种方式的前提是你拥有了一个自己的private ke 以及对应的 CSR,并且你想通过它们生成一个自签名证书。

下面的命令行基于一个private key (domain.key) 和对应的domain.csr创建一个elf-signed certificate (domain.crt):

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

待续未完

---恢复内容结束---

导语

人对任何事物的认识都是阶段性的,从无知到知晓,从懵懂到半知半解,从误解到将信将疑,从晕头转向到下定决心吃透。

介绍

OpenSSL是一个强大的命令行工具,它可以用来处理许多种跟PKI(Public Key Infrastructure)即:公钥基础建设、HTTPS(HTTP以及TLS)等相关的技术。这篇提纲挈领式的随笔文章可以提供快速的OpenSSL相关技术的命令咨询,这对于IT软件开发技术人员的日常工作来说非常的有必要。

这里主要包含了OpenSSL的一些例子,有:如何生成私钥(private key)、CSR(certificate signing requests)、如何生成证书(certificate)、以及如何对他们进行格式转换,这里当然只是一部分OpenSSL的最常用法了...

如何使用本文

  • 如果你不熟悉CSR,证书签名请求(certificate signing request),那么请从正文第一部分开始阅读
  • 除去第一部分,本文将会类似于命令行文档的形式进行介绍
  • 当你非常熟悉了解这些OpenSSL的基本技术知识之后,你可以随时随地直接查看你想要查看的正文部分,以备不时之需

什么是Certificate Signing Requests (CSRs)

如果你想获得一个经过certificate authority (CA)认证的SSL certificate,那么你必须首先生成或者持有一个certificate singning request(CSR证书签名请求,下文我将不再赘述中文)。一个CSR主要由一对公钥私钥中的public key、以及一些额外信息构成。

注意:CSR是由public key和一些类似公司明、国家、地区、省市的信息,两者构成,其中公钥还对应一个私钥,也就是说CSR的产生必须依赖一对公钥私钥。

任何时候你生成一个CSR,都会被提示并要求提供一些关于证书的信息,这些信息是公开的就像你的工牌一样作为你的唯一DN(Distinguised Name,识别名)。这些信息里面一个最重要的信息就是Comman Name(CN),这个信息是用来非常准确地描述该CSR所要产生的certificate的证书发布方的信息,这个信息全程Fully Qualified Domain Name(FQDN),通俗点解释:有一个https的服务器我假设它是大学,有一个CSR我把它比作学校教务处的章子,有个certificate我把它比作软件工程专业的毕业证书,章子上面有学校的最权威的信息,那么就很清楚了。对吧?

继续,当使用命令行生成CSR的时候会有FQDN的IO交互输入过程,当然你通过一路回车可以跳过这些输入的步骤从而生成一个全是空格信息的CSR。

另外,还有一条FQDN中比较中要的DN是关于提供你的公司信息、或者组织信息,如果你正在为你的老板开发一款应用或者产品并且被要求使用SSL证书认证机制,那么你就不能一路回车的方式生成CSR了,什么是组织信息?给举个例子:

---
Country Name (2 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 []:

如果你不像一个接着一个在控制台回答OpenSSL的csr生成输入交互,那么就使用下面一段代码一笔带过:

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

现在,你应该灰常明白CSR是什么了吧?如果还不太明白再回头看一边

如何生成CSR

前面说了,CSR里面包含了一个公钥、和QFDN,因此首先你得有一个公钥,如果没有你就要生成一个,但实际上公钥是由私钥生成的,可以这么理解:公钥是露在外头的萝卜茎叶、私钥是埋在土里的萝卜,要拿到公钥肯定得有萝卜啊⊙﹏⊙、

生成一个Private Key(私钥)和对应的CSR

如果你想使用HTTPS(HTTP之上的TLS)来加密您的Apache HTTP或者Nginx web server,并且你希望使用Certificate Authority (CA) 技术来处理SSL certificate证书,那么就可以使用以下方式产生CSR。这些通过此种方式产生的CSR可以被发送到一个CA机制里,用来请求通过CA认证并获得一个CA-signed SSL certificate(CA 认证的签名文件),如果你的CA机制支持SHA-2话增加-sha256这个选项参数到下面的命令行,这个参数项可以用SHA-2算法给你要生成的CSR进行签名。

下面的命令行生成一个2048-bit的private key(domain.key)以及一个CSR(domain.csr):

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

紧接着通过控制台的交互来输入你的QFDN信息,然后直至完成

注意:-newkey rsa:2048 这个参数项是用来指定这个这个private key生成的是2048-bit的结果,并且使用RSA算法。-nodes 这个参数项是用来指定private key不需要使用密码加固。

用已有的private key(私钥)来生成CSR

使用下面的方式来生成一个CSR,这个命令使用一个已存在的private key (domain.key)生成一个CSR(domain.csr):

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

回答控制台的交互输入直到完成CSR生成。

注意:-key 这个参数项是用来指定一个已存在的private key的位置。-out这个指示csr文件产生的位置及名称

用已存在的证书和私钥生成CSR

你必须清楚的是:CSR是证书发布方使用私钥+QFDNCSR产生的,CSR文件的内容由公钥+QFDN构成,证书是由CSR经过签名后颁发给证书持有方的。因此,通过一系列的算法是可以从证书里使用私钥算出CSR来,这就像是学校教务处收回了你的毕业证书抠掉你的照片和其他信息还原回来就是CSR了,CSR就等于是一个证书空壳子。

使用下面命令来创建一个新的CSR(domain.csr),当然它是基于已存在的certificate(domain.crt)以及你的private key(domain.key):

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

参数项 -x509toreq 用来表示使用一个X509类型的证书格式产生CSR。

生成一个SSL证书

如果你不想产生一个需要CA认证的证书,那么你就必须自己给这个证书签名,啊啊啊?什么意思?说形象点,你犯校规被拒绝颁发毕业证书,为了蒙骗你爹妈你自己给自己盖了个冒牌的章子,就这么理解。

一个可以正确被你自己识别证书当然可以是你自己签名的证书,这就等于你自己造了个冒牌毕业证书,你当然自己得首先相信它是个ok的证书咯,我们为这样的证书起名self-signed certificate(自签名证书)。self-signed certificate可以用来给你的数据加密,它的效果跟使用CA-signed的效果是一样的,不过当你把这样的证书加密的数据放到浏览器或者其他终端的时候会产生warning,最常见的就是在chrome浏览器力弹出提示说该站点不安全什么什么的,因为它未经过不再CA-signed列表里,如果你想让别的用户正常浏览有两种途径,一个是把证书颁发给用户并让用户导入该证书到浏览器或者其他终端应用,第二个就是交给CA授权认证(个人和小公司就算了吧)

下面这个章节主要讲述 self-signed certificates的细节

生成一个 self-signed certificates(自签名的证书)

使用下面的方式来生成一个自签名的证书,如果你将准备使用它来加密你的Apache HTTP 或者 Nginx web server,并且你确定你不需要使用CA认证的certificate。

下面的命令用来生成一个2048-bit的private key(domain.key)以及 self-signed certificate (domain.crt) :

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

回答控制台CSR的相关信息直到CSR生成完毕。

参数项 -x509 告诉req子命令创建一个自签名的证书,-days 365 这个参数项用来指定证书的有效时间为从现在开始的365天之后,一个中间临时产生的CSR文件将会连同上述信息一并出现,当然这很正常。

使用一个已存在的私钥生成一个self-signed certificate(自签名证书)

使用下面的方式生成一个自签名证书,当然前提是你已经拥有一个私钥。

使用下面的命令基于private key (domain.key)产生一个self-signed certificate (domain.crt) :

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

回答控制台CSR的相关信息直到CSR生成完毕。

参数项 -x509 告诉req子命令创建一个自签名的证书,-days 365 这个参数项用来指定证书的有效时间为从现在开始的365天之后,-new 用来激活CSR 信息询问交互

使用已存在的私钥和CSR来生成self-signed certificate(自签名证书)

使用这种方式的前提是你拥有了一个自己的private ke 以及对应的 CSR,并且你想通过它们生成一个自签名证书。

下面的命令行基于一个private key (domain.key) 和对应的domain.csr创建一个elf-signed certificate (domain.crt):

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

待续未完

原文地址:https://www.cnblogs.com/renhuihhh/p/renhuihhh_openssl.html