AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 845766
Accepted
bcardarella
bcardarella
Asked: 2017-04-22 05:50:11 +0800 CST2017-04-22 05:50:11 +0800 CST 2017-04-22 05:50:11 +0800 CST

使用可在 Chrome 58 中使用的 openssl 生成自签名证书

  • 772

从 Chrome 58 开始,它不再接受依赖于Common Name:https ://productforums.google.com/forum/#!topic/chrome/zVo3M8CgKzQ;context-place= topicsearchin/chrome/category $3ACanary%7Csort 的自签名证书:相关性%7Cspell:false

相反,它需要使用Subject Alt Name. 我以前一直在关注如何生成自签名证书的指南:https ://devcenter.heroku.com/articles/ssl-certificate-self效果很好,因为我需要server.crt和server.key文件来完成我正在做的事情。我现在需要生成新的证书,其中包括SAN但我所有的尝试都不适用于 Chrome 58。

这是我所做的:

我按照上面提到的 Heroku 文章中的步骤生成密钥。然后我写了一个新的 OpenSSL 配置文件:

[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

然后server.crt使用以下命令生成:

openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650

我在 Mac 上,所以我server.crt用钥匙串打开了文件,将它添加到我的系统证书中。然后我将其设置为Always Trust.

除了用于设置 SAN 值的配置文件之外,这些步骤与我在以前版本的 Chrome 中用于生成和信任自签名证书的步骤类似。

但是,在此之后,我仍然可以使用ERR_CERT_COMMON_NAME_INVALIDChrome 58。

ssl
  • 6 6 个回答
  • 122268 Views

6 个回答

  • Voted
  1. Best Answer
    bcardarella
    2017-04-22T07:55:07+08:002017-04-22T07:55:07+08:00

    我的解决方案:

    openssl req \
        -newkey rsa:2048 \
        -x509 \
        -nodes \
        -keyout server.key \
        -new \
        -out server.crt \
        -subj /CN=dev.mycompany.com \
        -reqexts SAN \
        -extensions SAN \
        -config <(cat /System/Library/OpenSSL/openssl.cnf \
            <(printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')) \
        -sha256 \
        -days 3650
    

    状态:为我工作

    • 77
  2. binary.koala
    2017-08-10T16:53:50+08:002017-08-10T16:53:50+08:00

    这是一个适合我的解决方案:

    创建 CA 密钥和证书

    # openssl genrsa -out server_rootCA.key 2048
    # openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem
    

    创建 server_rootCA.csr.cnf

    # server_rootCA.csr.cnf
    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    
    [dn]
    C=DE
    ST=Berlin
    L=NeuKoelln
    O=Weisestrasse
    OU=local_RootCA
    [email protected]
    CN = server.berlin
    

    创建 v3.ext 配置文件

    # v3.ext
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = server.berlin
    

    创建服务器密钥

    # openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )
    

    创建服务器证书

    # openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext
    

    将证书和密钥添加到 Apache2 站点文件、HTTPS(端口 443)部分

    SSLCertificateFile    /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile    /etc/apache2/ssl/server.key
    

    将 server_rootCA.pem 从服务器复制到您的计算机。

    # scp [email protected]:~/server_rootCA.pem .
    

    .. 并将其添加到 Chromium 浏览器

    Chromium -> Setting -> (Advanced) Manage Certificates -> Import -> 'server_rootCA.pem'
    

    你已经完成了!

    PS您可以简单地在 HTTP 服务器配置中禁用 HSTS 标头,而不是创建功能 CA 和服务器证书对(按照上面的说明)。这将阻止 Chromium 强制执行 HTTPS,并允许用户单击“高级 → 继续访问 your.url(不安全)”,而无需获取并安装您的自定义 CA (server_rootCA.pem) 证书。换句话说 - 必须禁用 HSTS 将允许通过 HTTP 和/或不安全的 HTTPS 连接公开查看您的网站(当心!)。

    对于 Apache2,将以下内容添加到站点文件 HTTP(端口 80)部分

    Header unset Strict-Transport-Security
    Header always set Strict-Transport-Security "max-age=0;includeSubDomains"
    

    在 Debian/Apache2.4 + Debian/Chromium 59 上测试

    https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

    • 22
  3. STWilson
    2017-05-19T10:30:29+08:002017-05-19T10:30:29+08:00

    在 Windows 中,将此脚本作为 makeCERT.bat 保存在 SSL 文件夹中。它将创建这些文件:example.cnf、example.crt、example.key

    @echo off
    
    REM IN YOUR SSL FOLDER, SAVE THIS FILE AS: makeCERT.bat
    REM AT COMMAND LINE IN YOUR SSL FOLDER, RUN: makecert
    REM IT WILL CREATE THESE FILES: example.cnf, example.crt, example.key
    REM IMPORT THE .crt FILE INTO CHROME Trusted Root Certification Authorities
    REM REMEMBER TO RESTART APACHE OR NGINX AFTER YOU CONFIGURE FOR THESE FILES
    
    REM PLEASE UPDATE THE FOLLOWING VARIABLES FOR YOUR NEEDS.
    SET HOSTNAME=example
    SET DOT=com
    SET COUNTRY=US
    SET STATE=KS
    SET CITY=Olathe
    SET ORGANIZATION=IT
    SET ORGANIZATION_UNIT=IT Department
    SET EMAIL=webmaster@%HOSTNAME%.%DOT%
    
    (
    echo [req]
    echo default_bits = 2048
    echo prompt = no
    echo default_md = sha256
    echo x509_extensions = v3_req
    echo distinguished_name = dn
    echo:
    echo [dn]
    echo C = %COUNTRY%
    echo ST = %STATE%
    echo L = %CITY%
    echo O = %ORGANIZATION%
    echo OU = %ORGANIZATION_UNIT%
    echo emailAddress = %EMAIL%
    echo CN = %HOSTNAME%.%DOT%
    echo:
    echo [v3_req]
    echo subjectAltName = @alt_names
    echo:
    echo [alt_names]
    echo DNS.1 = *.%HOSTNAME%.%DOT%
    echo DNS.2 = %HOSTNAME%.%DOT%
    )>%HOSTNAME%.cnf
    
    openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout %HOSTNAME%.key -days 3560 -out %HOSTNAME%.crt -config %HOSTNAME%.cnf
    
    • 19
  4. pavon
    2018-02-02T17:28:27+08:002018-02-02T17:28:27+08:00

    有几个很好的答案提供了如何让这个工作的例子,但没有一个可以解释你的尝试出了什么问题。OpenSSL 有时可能非常不直观,因此值得一试。

    首先,顺便说一句,OpenSSL 默认忽略您在配置中提供的任何专有名称值。如果你想使用它们,你必须添加prompt = no 到你的配置中。此外,所写的命令只生成证书 请求而不是证书本身,因此该-days命令什么也不做。

    如果您使用您提供的此命令生成证书请求并检查结果,则主题替代名称存在:

    $ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
    $ openssl req -text -noout -in server.csr
    Certificate Request:
        Data:
            Version: 1 (0x0)
            Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        ...
                    Exponent: 65537 (0x10001)
            Attributes:
            Requested Extensions:
                X509v3 Subject Alternative Name:
                    DNS:dev.mycompany.com
        Signature Algorithm: sha256WithRSAEncryption
             ...
    

    但是,如果您使用 heroku 链接中的命令生成证书并检查结果,则缺少主题替代名称:

    $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    $ openssl x509 -text -noout -in server.crt
    Certificate:
        Data:
            Version: 1 (0x0)
            Serial Number:
                89:fd:75:26:43:08:04:61
        Signature Algorithm: sha256WithRSAEncryption
            Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
            Validity
                Not Before: Jan 21 04:27:21 2018 GMT
                Not After : Jan 21 04:27:21 2019 GMT
            Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    Modulus:
                        ...
                    Exponent: 65537 (0x10001)
        Signature Algorithm: sha256WithRSAEncryption
             ...
    

    原因是默认情况下 OpenSSL 不会将扩展名从请求复制到证书。通常,证书将由 CA 根据客户的请求创建/签名,如果某些扩展程序盲目信任请求中定义的扩展程序,则某些扩展程序可能会授予证书比 CA 预期的更多的权力。

    有一些方法可以告诉 OpenSSL 复制扩展名,但恕我直言,这不仅仅是在生成证书时在配置文件中提供扩展名。

    如果您要尝试使用现有的配置文件,它将不起作用,因为顶级部分已标记[req],因此这些设置仅适用于 req 命令而不是 x509 命令。没有必要拥有顶级部分标记,因此您可以删除第一行,然后它可以正常用于生成请求或证书。

    $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
    

    或者,您可以使用命令的-x509参数req在单个命令中生成自签名证书,而不是先创建请求然后再创建证书。在这种情况下,不需要删除 [req]节行,因为该节由 req 命令读取和使用。

    $ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
    

    回顾一下,这是上述命令中使用的修改后的配置文件:

    default_bits        = 2048
    distinguished_name  = dn
    x509_extensions     = san
    req_extensions      = san
    extensions          = san
    prompt              = no
    [ dn ]
    countryName         = US
    stateOrProvinceName = Massachusetts
    localityName        = Boston
    organizationName    = MyCompany
    [ san ]
    subjectAltName      = DNS:dev.mycompany.com
    
    • 18
  5. JPvRiel
    2017-08-29T06:32:42+08:002017-08-29T06:32:42+08:00

    带有配置的 Bash 脚本

    作为一个可以跨平台使用 bash 的 shell 脚本。假设HOSTNAME为 shell 设置环境或提供您选择的主机名,例如self_signed_cert.sh test

    set -e
    
    if [ -z "$1" ]; then
      hostname="$HOSTNAME"
    else
      hostname="$1"
    fi
        
    local_openssl_config="
    [ req ]
    prompt = no
    distinguished_name = req_distinguished_name
    x509_extensions = san_self_signed
    [ req_distinguished_name ]
    CN=$hostname
    [ san_self_signed ]
    subjectAltName = DNS:$hostname, DNS:localhost, IP:127.0.0.1, IP:::1
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = CA:true
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign, cRLSign
    extendedKeyUsage = serverAuth, clientAuth, timeStamping
    "
        
    openssl req \
      -newkey rsa:2048 -nodes \
      -keyout "$hostname.key.pem" \
      -x509 -sha256 -days 3650 \
      -config <(echo "$local_openssl_config") \
      -out "$hostname.cert.pem"
    openssl x509 -noout -text -in "$hostname.cert.pem"
    

    以上或多或少注入了 openssl 所需的最低配置文件信息。

    请注意,包含额外DNS:localhost的 SAN 以允许更轻松地通过 localhost 进行测试。如果您不想要它,请从脚本中删除多余的部分。

    信用

    bcardarella 的回答很棒(由于代表不足,无法评论/投票)。但是,答案使用特定于平台的现有 openssl 配置文件位置......因此:

    为我工作

    显然,您只需要为您自己的给定平台找到 openssl 配置文件并替换正确的位置。

    测试

    要进行测试,请在 中导入test.cert.pemchrome 的权限chrome://settings/certificates,并且:

    openssl s_server -key test.key.pem -cert test.cert.pem -accept 20443 -www &
    openssl_pid=$!
    google-chrome "https://localhost:20443"
    google-chrome "https://127.0.0.1:20443"
    google-chrome "https://[::1]:20443"
    

    并且经过测试

    kill $openssl_pid
    
    • 6
  6. Patrick Mevzek
    2017-04-24T14:36:43+08:002017-04-24T14:36:43+08:00

    我的解决方案是保持主要openssl.cnf内容不变,并在最后添加一个新部分[ cert_www.example.com ],例如 www.example.com 是我要为其创建证书的网站,并在其中放入subjectAltName我需要的(和还要别的吗)。当然,该部分可以任意命名。

    之后,我可以openssl req像以前一样运行命令,只需添加-extensions cert_www.example.com要获取的内容,然后-subj添加直接添加所有 DN 信息。

    不要忘记在证书创建后和使用前验证证书内容,使用openssl x509 -text

    • 2

相关问题

  • 如何使用 Tomcat 5.5 更新 SSL 证书

  • 为 IIS6 自行生成 SSL 证书?

  • plesk 上的域和子域 ssl 访问

  • 如何设置 SSL 邮件服务器?

  • 如何通过 SVN 命令行接受 SSL 证书?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve