• 生成可信任的https证书-use


    配置生成CA证书

    总示意图:

    (1),通过openssl创建CA证书

    • 第一步:创建一个秘钥,这个便是CA证书的根本,之后所有的东西都来自这个秘钥
    1. # 通过rsa算法生成2048位长度的秘钥
    2. openssl genrsa -out myCA.key 2048
    • 第二步:是通过秘钥加密机构信息形成公钥
    1. # 公钥包含了机构信息,在输入下面的指令之后会有一系列的信息输入,
    2. # 这些信息便是机构信息,公司名称地址什么的
    3. # 这里还有一个过期信息,CA证书也会过期,openssl默认是一个月,这里设置为10年
    4. openssl req -new -x509 -key myCA.key -out myCA.cer -days 3650

    执行命令过程如下图所示:

    参数名称

    参数值

    Country Name

    国家代码,比如中国就是CN

    State or Province Name

    省名称

    Locality Name

    城市名称

    Organization Name

    机构名称

    Organizational Unit Name

    机构单位名称

    Common Name

    重点参数:授权给什么,因为机构是根节点所以是授权给自己

    Email Address

    邮件地址

    (2),创建服务器证书

    在得到CA证书之后,需要通过 openssl工具对证书进行转换得到公钥( .crt文件)和密钥( .key文件),无论CA证书是怎么来的到这里之后就没有任何区别了,服务器证书的制作流程相较CA证书要复杂一点点。

    第一步:通过openssl工具创建服务器的秘钥

    1. # 通过RSA算法生成长度2048位的秘钥
    2. openssl genrsa -out server.key 2048

    第二步:创建签名请求

    首先 https证书的公钥不同于自定义情况下的加密证书,这里需要安装浏览器标准进行配置,首先 openssl默认的证书版本是V1,V1在支持 https时部分浏览器依旧会认为不安全,所以需要使用V3版本;同时 openssl即便是使用V3版本依旧没有附带V3的 subjectAltName字段数据(这里是证书对应的IP地址或者域名,可以用通配符)。但是这些东西命令行没法指定所以需要配置文件,我这里准备了一个:
    创建 openssl.cnf 文件,并添加如下内容:
    1. tsa_policy2 = 1.2.3.4.5.6
    2. tsa_policy3 = 1.2.3.4.5.7
    3. [ ca ]
    4. default_ca = CA_default # The default ca section
    5. [ CA_default ]
    6. dir = ./demoCA # Where everything is kept
    7. certs = $dir/certs # Where the issued certs are kept
    8. crl_dir = $dir/crl # Where the issued crl are kept
    9. database = $dir/index.txt # database index file.
    10. new_certs_dir = $dir/newcerts # default place for new certs.
    11. certificate = $dir/cacert.pem # The CA certificate
    12. serial = $dir/serial # The current serial number
    13. crlnumber = $dir/crlnumber # the current crl number
    14. crl = $dir/crl.pem # The current CRL
    15. private_key = $dir/private/cakey.pem# The private key
    16. RANDFILE = $dir/private/.rand # private random number file
    17. x509_extensions = usr_cert # The extentions to add to the cert
    18. name_opt = ca_default # Subject Name options
    19. cert_opt = ca_default # Certificate field options
    20. default_days = 365 # how long to certify for
    21. default_crl_days= 30 # how long before next CRL
    22. default_md = default # use public key default MD
    23. preserve = no # keep passed DN ordering
    24. policy = policy_match
    25. [ policy_match ]
    26. countryName = match
    27. stateOrProvinceName = match
    28. organizationName = match
    29. organizationalUnitName = optional
    30. commonName = supplied
    31. emailAddress = optional
    32. [ policy_anything ]
    33. countryName = optional
    34. stateOrProvinceName = optional
    35. localityName = optional
    36. organizationName = optional
    37. organizationalUnitName = optional
    38. commonName = supplied
    39. emailAddress = optional
    40. [ req ]
    41. default_bits = 1024
    42. default_keyfile = privkey.pem
    43. distinguished_name = req_distinguished_name
    44. attributes = req_attributes
    45. x509_extensions = v3_ca # The extentions to add to the self signed cert
    46. string_mask = utf8only
    47. req_extensions = v3_req # The extensions to add to a certificate request
    48. [ req_distinguished_name ]
    49. countryName = Country Name (2 letter code)
    50. countryName_default = CN
    51. countryName_min = 2
    52. countryName_max = 2
    53. stateOrProvinceName = State or Province Name (full name)
    54. stateOrProvinceName_default = BeiJing
    55. localityName = Locality Name (eg, city)
    56. 0.organizationName = Organization Name (eg, company)
    57. 0.organizationName_default = myca
    58. organizationalUnitName = Organizational Unit Name (eg, section)
    59. commonName = Common Name (e.g. server FQDN or YOUR name)
    60. commonName_max = 64
    61. emailAddress = Email Address
    62. emailAddress_max = 64
    63. [ req_attributes ]
    64. challengePassword = A challenge password
    65. challengePassword_min = 4
    66. challengePassword_max = 20
    67. unstructuredName = An optional company name
    68. [ usr_cert ]
    69. basicConstraints=CA:FALSE
    70. nsCertType = client, email, objsign
    71. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    72. nsComment = "OpenSSL Generated Certificate"
    73. subjectKeyIdentifier=hash
    74. authorityKeyIdentifier=keyid,issuer
    75. [ svr_cert ]
    76. basicConstraints=CA:FALSE
    77. nsCertType = server
    78. keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyAgreement
    79. subjectKeyIdentifier=hash
    80. authorityKeyIdentifier=keyid,issuer
    81. extendedKeyUsage = serverAuth,clientAuth
    82. [ v3_req ]
    83. subjectAltName = @alt_names
    84. # 这里是重点,需要将里面配置为最终服务端需要的域名或者IP
    85. # 这里可以写多个,能够自行添加DNS.X = XXXXXX, 支持通配符
    86. [ alt_names ]
    87. DNS.1 = www.k8s-harbor.com
    88. DNS.2 = k8s-harbor.com
    89. [ v3_ca ]
    90. subjectKeyIdentifier=hash
    91. authorityKeyIdentifier=keyid:always,issuer
    92. basicConstraints = CA:true
    93. [ crl_ext ]
    94. authorityKeyIdentifier=keyid:always
    95. [ proxy_cert_ext ]
    96. basicConstraints=CA:FALSE
    97. nsComment = "OpenSSL Generated Certificate"
    98. subjectKeyIdentifier=hash
    99. authorityKeyIdentifier=keyid,issuer
    100. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
    101. [ tsa ]
    102. default_tsa = tsa_config1 # the default TSA section
    103. [ tsa_config1 ]
    104. dir = ./demoCA # TSA root directory
    105. serial = $dir/tsaserial # The current serial number (mandatory)
    106. crypto_device = builtin # OpenSSL engine to use for signing
    107. signer_cert = $dir/tsacert.pem # The TSA signing certificate
    108. # (optional)
    109. certs = $dir/cacert.pem # Certificate chain to include in reply
    110. # (optional)
    111. signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
    112. default_policy = tsa_policy1 # Policy if request did not specify it
    113. # (optional)
    114. other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
    115. digests = md5, sha1 # Acceptable message digests (mandatory)
    116. accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
    117. clock_precision_digits = 0 # number of digits after dot. (optional)
    118. ordering = yes # Is ordering defined for timestamps?
    119. # (optional, default: no)
    120. tsa_name = yes # Must the TSA name be included in the reply?
    121. # (optional, default: no)
    122. ess_cert_id_chain = no # Must the ESS cert id chain be included?
    123. # (optional, default: no)

    将上面的配置内容保存为openssl.cnf放到生成的服务器证书文件的目录下(注意:修改alt_names里面的域名或者IP为最终部署需要的地址,支持通配符),然后执行创建签名申请文件即可,执行运行:

    注意:在 openssl.conf中一定要加有关的域名,然后生成对应服务器的证书的时候也使用域名就可以实现正常的访问了。
    1. # 和创建CA时一样这里需要输入一堆服务器信息,输入项也是相同的。
    2. # 不过在输入Common Name(CN)最好直接输入服务器的IP地址或者域名。
    3. openssl req -config openssl.cnf -new -out server.req -key server.key

    执行命令过程如下图所示:

    第三步:通过CA机构证书对服务器证书进行签名认证

    这里服务器的公钥是由CA证书的密钥配对加密来的。
    1. # 这里本质上就是将签名请求文件进行签名最终得到服务器的公钥
    2. openssl x509 -req \
    3. -extfile openssl.cnf \
    4. -extensions v3_req \
    5. -CAkey myCA.key \
    6. -CA myCA.cer \
    7. -days 3650 \
    8. -in server.req \
    9. -out server.cer \
    10. -CAcreateserial -CAserial serial

    cer证书转成crt证书

    命令如下:

    openssl x509 -inform PEM -in server.cer -out server.crt

    crt证书转成cert证书

    命令如下:

    openssl x509 -inform PEM -in server.crt -out server.cert

    cer证书转换为jks证书:

    1. # 方法一:
    2. keytool -import \
    3. -alias certificate_alias \
    4. -file server.cer \
    5. -keystore server.jks
    6. # 方法二:
    7. # 1. 将cer证书转换为PKCS12格式的证书
    8. keytool -importcert \
    9. -file server.cer \
    10. -keystore server.p12 \
    11. -storetype PKCS12
    12. # 2. 将PKCS12格式的证书转换为JKS格式的证书
    13. keytool -importkeystore \
    14. -destkeystore server.jks \
    15. -srckeystore server.p12 \
    16. -srcstoretype pkcs12 \
    17. -alias alias_name # 无 alias 则不加此参数

    信任CA机构证书

    通过openssl创建的CA证书,只需要将CA证书的公钥(myCA.cer文件)导入到系统信任的根证书颁发机构里面就行了,即直接双击cer文件进行证书安装,最终不光是windows系统,任何操作系统都可以安装证书来进行对CA机构的进行信任操作。

    • 第一步:双击证书,点击【安装证书】;
    • 第二步:选择【本地计算机】,根据提示选择【是】;
    • 第三步:选择【将所有的证书都放入下列存储】,并点击【浏览(R)】;
    • 第四步:选择【受信任的根证书颁发机构】,并点击【确定】;
    • 第五步:选择【下一页(N)】,紧接着点【完成】。

    或者,通过chrome 浏览器添加证书(use):

    打开 "设置" --》 "隐私和安全" --》"安全" --》“管理设备证书”--》"受信任的根证书颁发机构" --》"导入",最终导入 myCA.cer 证书文件即可。
    导入成功后,可在 "受信任的根证书颁发机构"列表查看到该证书。

    为 harbor 和 docker 颁发证书

    (1) 将服务端证书拷贝至 /data/cert/目录下

    1. mkdir -p /data/cert/
    2. cp server.crt /data/cert/
    3. cp server.key /data/cert/

    (2) 将 server.crt 文件拷贝到docker的证书目录下,注意替换为自己的域名

    1. mkdir -p /etc/docker/certs.d/www.k8s-harbor.com/
    2. cp server.crt /etc/docker/certs.d/www.k8s-harbor.com/

    这里需要注意的是,如果nginx中对https没有使用默认的443端口,修改为其他端口了,则此时的需要创建的目录为:/etc/docker/certs.d/yourdomain.com:port, 或者 /etc/docker/certs.d/harbor_IP:port

    (3) 重启docker

    systemctl restart docker

    修改 harbor.yml 配置文件

    修改harbor.yml配置 (位于/usr/local/harbor),开启 https 配置。

    如下前面部署 http 模式的时候将https的部分注释了,这里要将 https 的配置放开注释,而且修改证书的文件路径,如下所示
    1. # Configuration file of Harbor
    2. # The IP address or hostname to access admin UI and registry service.
    3. # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
    4. hostname: harbor.ninexch.com #更改为本地解析IP的域名
    5. # http related config
    6. http:
    7. # port for http, default is 80. If https enabled, this port will redirect to https port
    8. port: 80
    9. # https related config
    10. https: #开启Https
    11. # https port for harbor, default is 443
    12. port: 443 #开启端口
    13. # The path of cert and key files for nginx
    14. certificate: /data/cert/server.crt #指定SSL公有证书
    15. private_key: /data/cert/server.key #指定SSL私有证书

    然后执行如下命令更新 harbor

    1. # 重新安装(harbor相关容器会被删除,数据正常不会丢失)
    2. ./install.sh
    3. # 重新编译配置文件(数据会丢失) -- no use
    4. ./prepare
    5. docker-compose down -v
    6. docker-compose up -d

    Nginx 配置 https

    修改 nginx.conf 配置,增加监听 443 端口的,跳转到harbor的8443端口,此外在这里需要指定证书文件的路径

    1. server {
    2. listen 443 ssl;
    3. server_name www.k8s-harbor.com;
    4. ssl_certificate /data/cert/server.crt;
    5. ssl_certificate_key /data/cert/server.key;
    6. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    7. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    8. ssl_session_cache shared:SSL:1m;
    9. ssl_session_timeout 5m;
    10. location / {
    11. client_max_body_size 1024M;
    12. client_body_buffer_size 1024M;
    13. proxy_redirect off;
    14. proxy_pass https://172.22.27.162:8443;
    15. proxy_set_header Host $host;
    16. proxy_set_header X-Real-IP $remote_addr;
    17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    18. }
    19. error_page 500 502 503 504 /50x.html;
    20. location = /50x.html {
    21. root html;
    22. }
    23. }

    然后将 http 的跳转到 https

    1. server {
    2. listen 80;
    3. server_name www.k8s-harbor.com;
    4. return 301 https://www.k8s-harbor.com$request_uri;
    5. }

    然后重新加载配置文件

    nginx -s reload
    此时在浏览器就可以 通过 http://www.k8s-harbor.comhttps://www.k8s-harbor.com 访问,当使用 http://www.k8s-harbor.com 时会发现自动跳转到 https://www.k8s-harbor.com

    Nginx 配置可能遇到额问题

    注意,如果出现类似如下错误:

    nginx: [emerg] unknown directive "ssl_certificate" in /usr/local/nginx/conf/nginx.conf

    或者类似如下错误;

    error: SSL modules require the OpenSSL library.

    说明 nginx 没有安装ssl,此时进入nginx的源码目录,执行如下命令

    1. ./configure \
    2. --prefix=/usr/local/nginx \
    3. --with-http_stub_status_module \
    4. --with-http_ssl_module \
    5. --with-openssl=/usr/local/src/openssl-1.1.1o

    其中:

    • /usr/local/src/openssl-1.1.1o 目录 为openssl 源码包的解压目录

    然后使用 make 编译,注意,不要使用 make install,否则会覆盖

    make

    然后备份原有的nginx 命令,并将新编译的nginx拷贝的nginx命令所在的目录

    1. # 将原有的命令重命名备份
    2. mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bark
    3. # 将新编译的nginx命令拷贝到nginx命令的目录下
    4. cp objs/nginx /usr/local/nginx/sbin/

    然后执行 nginx -V ,如下,出现 —with-http_ssl_module 表示安装成功

    1. [root@redrose2100 nginx-1.21.4]# nginx -V
    2. nginx version: nginx/1.21.4
    3. built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
    4. built with OpenSSL 1.1.1o 3 May 2022
    5. TLS SNI support enabled
    6. configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-1.1.1o
    7. [root@redrose2100 nginx-1.21.4]#

    然后再次执行如下命令重新加载nginx配置

    nginx -s reload

    原理简介

    (1),有一个CA机构

    只有CA机构的公钥证书被安装在受信任的根证书颁发机构,才能达到将做到让系统信任。
    • 第一步:需要创建一个密钥文件(myCA.key);
    • 第二步:根据这个创建出一个公钥文件(myCA.cer)。
      经过如上两步操作之后,我们就自定义了一个CA证书,意味着我们有了一个CA机构。

    (2),再自定义生成一个证书文件,并通过CA机构进行签名

    • 第一步:创建一个密钥文件(server.key);
    • 第二步:创建一个签名请求的配置文件(openssl.cnf);
    • 第三步:根据配置文件,创建出一个签名的请求,也会生成一个文件(server.req);
    • 第四步:通过CA机构对我们的密钥文件(server.crt) 和 签名请求(server.req) 一起来生成自定义的公钥证书(server.cer)
    • 第五步:如果需要,也可以将.cer文件转成.crt文件;
    • 第六步:就是将证书通过Nginx代理;

    (3),最后,将CA结构添加到访问者的受信任区

    因为我们自定义的CA机构一定不再请求的信任区内的,所以我们需要手动添加一下才可以。

    参考连接

    1, 局域网内搭建浏览器可信任的SSL证书
    2, 将cer格式的证书转为crt格式
    3, 生成可信任的https证书 - 简书
  • 相关阅读:
    C#连接MySql数据库详细步骤
    JSR303和拦截器
    用mysql和java写一个简易点名器
    【笔者感悟】笔者的工作感悟【五】
    TCP 报文首部的 6 个标记位
    项目管理,看这篇就够了,但一定要实操!
    【Python基础入门8】关于字符串
    [Apache Kafka 3.2源码解析系列]-6- Kafka客户端的IO线程KafkaThread
    2022年亚太杯APMCM数学建模大赛D题储能系统中传热翅片的结构优化求解全过程文档及程序
    arcgis 栅格数据处理2——栅格转地级市(栅格转矢量图)
  • 原文地址:https://blog.csdn.net/justlpf/article/details/132831083