创建自签名 SSL 数字证书以配置开发测试环境站点 HTTPS 访问

栏目: 编程工具 · 发布时间: 6年前

内容简介:数字证书是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示 CA 结构对证书持有者的认可。数字证书拥有以下几个优点:X.509 证书包含三个文件:key,csr,crt。在密码学中,X.509 是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

1 什么数字证书(Certificate)

数字证书是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示 CA 结构对证书持有者的认可。数字证书拥有以下几个优点:

  • 使用数字证书能够提高用户的可信度
  • 数字证书中的公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
  • 在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上

X.509 证书包含三个文件:key,csr,crt。

key
csr
crt

在密码学中,X.509 是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

浏览器检查一个证书是否仍然有效有两种方法: OCSP (Online Certificate Status Protocol,在线证书状态协议) 和 CRL(Certificate Revoke List,证书吊销列表)。

2 创建自签名的证书

用于生产环境的数字证书,颁发机构(CA)必须是可信的第三方机构。在应用开发过程中,我们可以生成自签名的证书以配置开发或测试环境。

2.1 逐步生成私钥和自签名证书

2.1.1 生成服务器私钥

openssl genrsa -des3 -out server.key 4096

2.1.2 生成证书签名请求

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

这里要填一大堆东西,注意 Common Name 处应填写你希望使用的网站域名

2.1.3 对上一步生成的证书签名请求进行签名

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

2.1.4 生成无需密码的服务器私钥

如果私钥是有密码的,则每次启动 web 服务器都会要求你输入密码。

openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insecure server.key

修改证书秘钥的读取权限,确保你的私钥的安全性,因为该证书无法被吊销。

chmod 999  server.key.secure  server.key

2.2 一步创建私钥和自签名证书

有一个简单的方法一步创建私钥和自签名请求:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt

输入信息参考:

writing new private key to 'server.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]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:GZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:lzwme
Organizational Unit Name (eg, section) []:blog
Common Name (e.g. server FQDN or YOUR name) []:*.lzw.me
Email Address []:webmaster@lzw.me

以上所有操作中, server.key 为私钥, server.crt 为证书。

3 创建私有 CA 证书,并创建用该 CA 证书签名的证书

3.1 生成 CA 私钥(ca.key)和 CA 证书(ca.crt)

CA 证书就是一个自签名的证书,只是在 Common Name 处可以随意填写。

openssl genrsa -out server.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
// 或者一步生成
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ca.key -out ca.crt

3.2 生成服务器使用的私钥(server.key)和证书签名请求文件(server.csr)

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

注意,这里的 Common Name 应当和希望使用的域名或 IP 相同。

3.3 使用 CA 私钥和证书对 server 证书签名

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

4 网站服务器配置使用自签名的证书

nginx 配置和正常的 https 站点配置相同,主要信息参考:

server {
  listen 443 ssl;
  ssl on;
  ssl_certificate /path/to/server.crt;
  ssl_certificate_key /path/to/server.key;
  server_name test.lzw.me;
}

自建 nodejs server 参考:

const https = require('https');
const fs = require('fs');
const path = require('path');
const server = https.createServer({
  key: fs.readFileSync(path.join(__dirname, './ssl/server.key'), 'utf8'),
  cert: fs.readFileSync(path.join(__dirname, './ssl/server.crt'), 'utf8'),
  ca: [fs.readFileSync(path.join(__dirname, './ssl/ca.key'),'utf8')],
}, app);

5 用户端添加 CA 证书为 受信任的根证书颁发机构

用户端的机器上,需将 ca.crt 证书添加为可信颁发机构。方法步骤大致如下:

双击 ca.crt -> 安装证书 -> 本地计算机 -> 选择“将所有的证书都放入下列存储” -> 浏览 -> 受信任的根证书颁发机构 -> 确定。

6 相关问题

6.1 如何查看各种证书的信息

以下为一些常见的查看证书相关信息的方法。

  • openssl rsa -noout -text -in server.key 查看私钥信息
  • openssl req -noout -text -in server.csr 查看签名请求信息
  • openssl rsa -noout -text -in ca.key   查看ca的私钥信息
  • openssl x509 -noout -text -in ca.crt  查看证书信息
  • openssl crl -text -in xx.crl  查看一个证书吊销列表信息
  • openssl x509 -purpose -in cacert.pem  查看一个证书的额外信息
  • openssl rsa -in key.pem -pubout -out pubkey.pem 从一个私钥里面提取出公钥
  • openssl rsa -noout -text -pubin -in apache.pub  查看一个公钥的信息
  • openssl verify  -CAfile 指定CA文件路径 apache.crt  验证一个证书是否是某一个CA签发
  •  openssl s_client -connect 192.168.20.51:443   模拟一个ssl客户端访问ssl服务器。如果服务端要求客户端提供证书,则在加上 -cert 和 -key 参数。比如 openssl s_client -connect 192.168.20.51:443 -cert client.crt -key client.key
  • openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys  从p12文件里面提取证书
  • openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes  从p12文件里面提取私钥

6.2 代理软件、应用程序内访问 https 服务报错 Error: self signed certificate

如果正确地添加了 CA 证书为 受信任的根证书颁发机构 ,一般来说应该可以正常使用。如果在应用内访问出现该错误提示,可尝试禁用 SSL 安全验证。以 nodejs 中使用 http.request 为例:

const https = require('https');
const options = {
  host: 'test.lzw.me',
  port: 8000,
  path: '/api/test',
  // Add these next lines
  rejectUnauthorized: false,
  requestCert: true,
  agent: false,
  secure: false,
};
https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();

相关参考

  • https://blog.csdn.net/sdcxyz/article/details/47220129
  • https://blog.csdn.net/h330531987/article/details/74991694

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Persuasive Technology

Persuasive Technology

B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95

Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具