生成自签名证书

  1. $ openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt
  2. Generating a RSA private key
  3. .................................+++++
  4. ....................................................+++++
  5. writing new private key to 'rsa_private.key'
  6. -----
  7. You are about to be asked to enter information that will be incorporated
  8. into your certificate request.
  9. What you are about to enter is what is called a Distinguished Name or a DN.
  10. There are quite a few fields but you can leave some blank
  11. For some fields there will be a default value,
  12. If you enter '.', the field will be left blank.
  13. -----
  14. # 国家代码,两位字母
  15. Country Name (2 letter code) [AU]:CN
  16. # 名称(全称)[某些州]
  17. State or Province Name (full name) [Some-State]:
  18. # 地区名称(如城市)
  19. Locality Name (eg, city) []:
  20. # 机构名称(如公司)
  21. Organization Name (eg, company) [Internet Widgits Pty Ltd]:
  22. # 组织单位名称(如部门):
  23. Organizational Unit Name (eg, section) []:
  24. # 常用名称(例如服务器FQDN或您的名称)
  25. Common Name (e.g. server FQDN or YOUR name) []:pbx.cn
  26. # 电子邮件地址
  27. Email Address []:99299684@qq.com
  28. # 执行完成后,就会生成以下两个文件
  29. cert.crt
  30. rsa_private.key
  • req 是证书请求的子命令,
  • -newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8 格式),
  • -nodes 表示私钥不加密,若不带参数将提示输入密码;
  • -x509表示输出证书
  • -days365 为有效期,此后根据提示输入证书拥有者信息;

还可以一条命令输入以上流程的信息,使用 -subj 参数

  1. openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 365 -out cert.crt -subj "/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN=vivo.com/emailAddress=yy@vivo.com"

自签名证书如何安装到系统受信任的根证书颁发机构

请参考笔记

Chrome 标记自签名证书是不安全的

参考该博文

就算导入到受信任的根证书后,还是无法变成安全的
image.png
是因为需要增加 -extfile private.ext 参数来生成,使用根证书 生成 子证书。

生成根证书

创建 MyCompanyCA.cnf 文件,这是申请 CA 根证书的配置文件;

  1. [ req ]
  2. distinguished_name = req_distinguished_name
  3. x509_extensions = root_ca
  4. [ req_distinguished_name ]
  5. # 以下内容可随意填写
  6. countryName = CN (2 letter code)
  7. countryName_min = 2
  8. countryName_max = 2
  9. stateOrProvinceName = ZheJiang
  10. localityName = HangZhou
  11. organizationName = Mycompany
  12. organizationalUnitName = technology
  13. commonName = develop
  14. commonName_max = 64
  15. emailAddress = xxxxxxxx@gmail.com
  16. emailAddress_max = 64
  17. [ root_ca ]
  18. basicConstraints = critical, CA:true

生成 跟证书

  1. openssl req -x509 -newkey rsa:2048 -out MyCompanyCA.cer -outform PEM -keyout MyCompanyCA.pvk -days 10000 -verbose -config MyCompanyCA.cnf -nodes -sha256 -subj "/CN=MyCompany CA"

生成域名证书

创建 MyCompanyLocalhost.ext ,这是生成服务器证书的扩展配置文件,里面写该证书支持的域名。ip 信息

  1. subjectAltName = @alt_names
  2. extendedKeyUsage = serverAuth
  3. [alt_names]
  4. # 域名,如有多个用DNS.2,DNS.3…来增加
  5. DNS.1 = domain.com
  6. DNS.1 = mrcode.cn
  7. # IP地址
  8. IP.1 = 192.168.2.221
  9. IP.2 = 127.0.0.1

生成服务器证书

  1. # CN 后面写颁发给哪个机构的名称,比如 mrcode.cn, 不一定是域名,因为域名信息在 MyCompanyLocalhost.ext 中已经包含了
  2. # 生成服务器私钥 MyCompanyLocalhost.pvk 就是私钥文件,也就是平时看见的 rsa_private.key 文件
  3. openssl req -newkey rsa:2048 -keyout MyCompanyLocalhost.pvk -out MyCompanyLocalhost.req -subj /CN=localhost -sha256 -nodes
  4. # 使用根证书生成服务器证书
  5. # MyCompanyLocalhost.cer 是证书文件名
  6. openssl x509 -req -CA MyCompanyCA.cer -CAkey MyCompanyCA.pvk -in MyCompanyLocalhost.req -out MyCompanyLocalhost.cer -days 10000 -extfile MyCompanyLocalhost.ext -sha256 -set_serial 0x1111

生成之后,其中:

  • MyCompanyCA.cer:是导入到客户端,也就是浏览器所在机器的 受信任的根证书上
  • MyCompanyLocalhost.cer、MyCompanyLocalhost.pvk: 这两个就是部署在服务器上的

方式二

这种方式感觉比较简单一点

  1. # 生成 root 私钥
  2. openssl genrsa -des3 -out InnovateAsterisk-Root-CA.key 4096
  3. # 生成 root ca 证书
  4. openssl req -x509 -new -nodes -key InnovateAsterisk-Root-CA.key -sha256 -days 3650 -out InnovateAsterisk-Root-CA.crt

生成服务器证书

  1. # 生成私钥,会叫你设置一个密码,这个私钥密码,后续的操作中可能会用到
  2. openssl req -new -sha256 -nodes -out raspberrypi.csr -newkey rsa:2048 -keyout raspberrypi.key
  3. # 编写配置文件
  4. vim openssl-v3.cnf
  5. # 填写下面的内容,同样控制给哪些域名或则 IP 验证
  6. authorityKeyIdentifier=keyid,issuer
  7. basicConstraints=CA:FALSE
  8. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  9. subjectAltName = @alt_names
  10. [alt_names]
  11. DNS.1 = pbx.cn
  12. IP.1 = 192.168.110.20
  13. IP.2 = 127.0.0.2
  14. # 使用根证书生成服务器证书
  15. openssl x509 -req -in raspberrypi.csr -CA InnovateAsterisk-Root-CA.crt -CAkey InnovateAsterisk-Root-CA.key -CAcreateserial -out raspberrypi.crt -days 365 -sha256 -extfile openssl-v3.cnf

:::tips 需要注意的是:由于以上命令没有使用 -subj 参数,弹出来的各种信息,最好都填写下,不影响授权,不填写的话,有时候有些程序会有识别问题 :::