google-chrome - 如何在 Linux Chrome 和 Firefox 上信任自签名本地主机证书

标签 google-chrome ssl firefox localhost self-signed

我尝试为指向 127.0.0.1 的自定义本地域生成自签名证书:

# /etc/hosts
127.0.0.1 subdomain.domain.local

我已经使用 openssl 生成了一个自签名证书并记住过去一切都有效。但似乎自 Chrome 58 以来,使用自签名证书的限制要多得多。

我的尝试以“ 您的连接不是私有(private)的 ”结束,并出现以下错误之一:
  • 安全证书不受信任 ”如果我像过去一样继续。
  • 尝试将其导入 Chrome 时,“ 不是证书颁发机构 ”。
  • 缺少主题备用名称 ”在导入 CA 后使用证书时。

  • 我很确定我在这个过程中遗漏了一些东西。拜托,任何人都可以提供处理替代名称的有效配置以及创建相应 CA 和证书的确切步骤,以便 Chrome 和 Firefox 可以处理我的本地自定义域吗?

    最佳答案

    TLDR

  • 创建文件 generate.sh
    #!/usr/bin/env bash
    find . \( -name "$1.*" -o -name "*.srl" \) -type f -delete
    cp /usr/lib/ssl/openssl.cnf $1.cnf
    python <(
    cat << "END"
    import sys
    from ConfigParser import ConfigParser
    from StringIO import StringIO
    
    domain = sys.argv[1]
    
    config = ConfigParser()
    config.optionxform = lambda option: option
    
    name = "{}.cnf".format(domain)
    
    with open(name, "rb") as stream:
      config.readfp(StringIO("[top]\n" + stream.read()))
    
    config.set(" v3_ca ", "subjectKeyIdentifier", "hash")
    config.set(" v3_ca ", "authorityKeyIdentifier", "keyid:always,issuer")
    config.set(" v3_ca ", "basicConstraints", "critical, CA:TRUE, pathlen:3")
    config.set(" v3_ca ", "keyUsage", "critical, cRLSign, keyCertSign")
    config.set(" v3_ca ", "nsCertType", "sslCA, emailCA")
    
    config.set(" v3_req ", "basicConstraints", "CA:FALSE")
    config.set(" v3_req ", "keyUsage", "nonRepudiation, digitalSignature, keyEncipherment")
    config.set(" v3_req ", "subjectAltName", "@alt_names")
    config.remove_option(" v3_req ", "extendedKeyUsage")
    
    config.add_section(" alt_names ")
    config.set(" alt_names ", "DNS.1", domain)
    config.set(" alt_names ", "DNS.2", "*.{}".format(domain))
    
    config.set(" req ", "req_extensions", "v3_req")
    
    with open(name, "wb") as stream:
        config.write(stream)
    END
    ) $1
    tail -n +2 $1.cnf > $1.cnf.tmp && mv $1.cnf.tmp $1.cnf
    echo "$1\n" | openssl genrsa -aes256 -out $1.ca.key 2048
    chmod 400 $1.ca.key
    openssl req -new -x509 -subj "/CN=$1" -extensions v3_ca -days 3650 -key $1.ca.key -sha256 -out $1.ca.crt -config $1.cnf
    openssl genrsa -out $1.key 2048
    openssl req -subj "/CN=$1" -extensions v3_req -sha256 -new -key $1.key -out $1.csr
    openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $1.csr -CA $1.ca.crt -CAkey $1.ca.key -CAcreateserial -out $1.crt -extfile $1.cnf
    openssl x509 -in $1.crt -text -noout
    
  • 调用 ./generate.sh example.com

    Requires Python 2



  • All credits go to this excellent article by Fabian Lee.



    使用 OpenSSL 创建受信任的 CA 和 SAN 证书
  • 自定义 openssl.cnf
  • 创建 CA 证书
  • 使用 CA 签名的 SAN 创建服务器证书

  • 先决条件

    作为先决条件,请确保已安装 SSL 软件包:
    $ sudo apt install libssl1.0.0 -y
    

    自定义openssl.cnf

    第一步是抢openssl.cnf您的系统上可用的模板。在 Ubuntu 上,这可以在 /usr/lib/ssl/openssl.cnf 上找到。 .您可以在 /System/Library/OpenSSL/ 中找到此信息在 MacOS 上,和 /etc/pki/tls在 Redhat 变体上。
    export prefix="mydomain"
    
    cp /usr/lib/ssl/openssl.cnf $prefix.cnf
    
    $prefix.cnf需要使用有关我们将要生成的证书的特定信息进行修改。

    [ v3_ca ]部分,添加以下值。对于 CA,这意味着我们正在创建一个将用于 key 签名的 CA。
    [ v3_ca ]
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid:always,issuer
    basicConstraints = critical, CA:TRUE, pathlen:3
    keyUsage = critical, cRLSign, keyCertSign
    nsCertType = sslCA, emailCA
    

    然后下[ v3_req ]部分,设置以下以及此证书的所有有效替代名称。
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    #extendedKeyUsage=serverAuth
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = mydomain.com 
    DNS.2 = *.dydomain.com
    

    还要取消注释 [ req ] 下的以下行部分,以便使用 v3 扩展创建证书请求。
    req_extensions = v3_req
    

    当我们生成每种类型的 key 时,我们指定了我们想要使用的扩展部分,这就是为什么我们可以共享 $prefix.cnf用于创建 CA 和 SAN 证书。

    创建 CA 证书

    现在我们将开始使用 OpenSSL 创建必要的 key 和证书。首先生成私有(private)/公共(public) RSA key 对:
    openssl genrsa -aes256 -out ca.key.pem 2048
    
    chmod 400 ca.key.pem
    

    这使用基于 AES256 的密码对 key 文件进行编码。
    然后我们需要创建自签名根 CA 证书。
    openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf
    

    您可以使用以下方法验证此根 CA 证书:
    openssl x509 -in ca.pem -text -noout
    

    这将显示根 CA 证书,以及 IssuerSubject将是相同的,因为这是自签名的。这被标记为 CA:TRUE这意味着它将被识别为根 CA 证书;这意味着浏览器和操作系统将允许将其导入到其受信任的根证书存储中。
    Issuer: CN=myca 
    ... 
    Subject: CN=myca 
    ... 
    X509v3 Basic Constraints: 
      critical CA:TRUE, pathlen:3 
    X509v3 Key Usage: 
      critical Certificate Sign, CRL Sign 
    Netscape Cert Type: 
      SSL CA, S/MIME CA
    

    创建由 CA 签署的服务器证书

    现在创建了根 CA,我们切换到服务器证书。首先生成私有(private)/公共(public) RSA key 对:
    openssl genrsa -out $prefix.key.pem 2048
    

    我们没有在这个 key 上设置密码,仅仅是因为 CA 是更有值(value)的目标,我们总是可以重新生成服务器证书,但请随时采取这种额外的预防措施。

    然后创建服务器证书签名请求:
    openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr
    

    然后使用以下内容生成服务器证书:服务器签名请求、CA 签名 key 和 CA 证书。
    openssl x509 -req -extensions v3_req -days 3650 -sha256 -in $prefix.csr -CA ca.pem -CAkey ca.key.pem -CAcreateserial -out $prefix.crt -extfile $prefix.cnf
    
    $prefix.key.pem是服务器私钥和 $prefix.crt是服务器证书。验证证书:
    openssl x509 -in $prefix.crt -text -noout
    

    这将显示证书和 Issuer将是 CA 名称,而主题是前缀。这未设置为 CA,并且 Subject Alternative Name字段包含浏览器认为有效的 URL。
    Issuer: 
     CN=myca 
    ... 
    Subject: 
      CN=mydomain 
    ... 
    X509v3 Basic Constraints: 
      CA:FALSE 
    X509v3 Key Usage: 
      Digital Signature, Non Repudiation, Key Encipherment 
    X509v3 Subject Alternative Name:
      DNS:mydomain.com, DNS:*.mydomain.com
    

    浏览器评估

    当您第一次使用带有 CA 签名的 SAN 证书将 Chrome 或 Firefox 指向站点时,它会抛出与自签名 SAN 证书相同类型的异常。这是因为根 CA 证书不被认为是签名证书的可信来源。

    Chrome 合金

    Linux

    在 Linux 上,Chrome 管理自己的证书存储,您应该再次导入 ca.pemAuthorities .这现在应该使安全图标变成绿色。
    enter image description here

    视窗

    在 Chrome 设置 ( chrome://settings ) 中,搜索 certificates然后点击 Manage Certificates .在 Windows 上,这将打开 Windows 证书管理器,您应该导入 ca.pem文件位于 Trusted Root Certification Authorities标签。这相当于通过 mmc.exe 添加它,在 local user受信任的根存储(不是计算机级别)。

    火狐

    在 Firefox 选项中 about:preferences , 搜索 certificates然后点击 View Certificates .转至 Authorities选项卡并导入 ca.pem .选中该框以使其信任网站,现在当您访问该页面时,锁定图标应变为绿色。
    enter image description here

    关于google-chrome - 如何在 Linux Chrome 和 Firefox 上信任自签名本地主机证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50788043/

    相关文章:

    html - 图片上的HTML5音频请点击

    java - Java 8 : 'javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.h: Certificate chaining error' 中的错误

    javascript - Facebook 如何在 Chrome 和 Firefox 中重写 URL?

    javascript - Firefox - 设置 Blob 下载源

    css - -webkit 剪辑路径 :inset equivalent in Firefox

    javascript - 如何获取由 HTML 完成的网络请求列表

    java - JxBrowser 占用大量内存

    google-chrome - Chrome DevTools 设备在插入时未检测到设备

    ruby-on-rails - Rails.application.initialize 后 Rails ssl 证书验证失败

    apache - 如何将页面重定向到 https 和站点的 'www' 版本