【问题标题】:How to make browser trust localhost SSL certificate?如何使浏览器信任 localhost SSL 证书?
【发布时间】:2018-09-08 05:43:32
【问题描述】:

虽然有aresimilarquestions,甚至goodanswers,但他们要么不关心本地主机,要么询问一个特定的选项/解决方案(自签名与CA )。

有哪些选择?他们如何比较?我该怎么做?

【问题讨论】:

    标签: openssl localhost ssl-certificate self-signed ca


    【解决方案1】:

    tl;dr 生成自己的 CA 颁发的证书(参见下面的脚本)

    这是我发现的。纠正我的错误。

    有 CA(证书颁发机构)。他们为其他 CA(中间 CA)或服务器(最终实体证书)颁发证书(签署 CSR)。其中一些是根权限。他们有自己签发的自签名证书。也就是说,通常存在从服务器证书到根证书的信任链。而且没有人可以保证根证书。因此,操作系统有一个根证书存储(或信任策略存储),一个系统范围的受信任根证书列表。浏览器有自己的受信任证书列表,其中包括系统范围的列表和用户信任的证书。

    在 Chromium 中,您可以在 chrome://settings/certificates 管理证书。在 Firefox 中,Preferences > Privacy & Security > Certificates > View Certificates。两者都有 Authorities 选项卡,这是受信任的根证书的列表。和服务器选项卡,受信任的服务器证书列表。

    要获得您创建 CSR(证书签名请求)的证书,请将其发送给 CA。 CA 签署 CSR,在此过程中将其转化为可信证书。

    证书和 CSR 是一堆包含信息和公钥的字段。一些字段被称为扩展。 CA 证书是带有basicConstraints = CA:true 的证书。

    您可以在 Developer Tools > Security 中检查 Chromium 中的证书错误。

    全系统信任证书

    当您更改操作系统的根证书存储时,您必须重新启动浏览器。你改变它:

    # trust anchor path/to/cert.crt
    # trust anchor --remove path/to/cert.crt
    

    trust 将 CA 证书置于“授权”类别 (trust list) 或“其他条目”类别下。 CA 证书显示在浏览器的“授权”选项卡中,或者显示在“服务器”选项卡中。

    与 Chromium 不同,Firefox 不信任来自操作系统根证书存储的服务器证书。两者都信任来自操作系统根证书存储的 CA 证书。

    在浏览器中信任证书

    在 Chromium 和 Firefox 中,您可以将证书添加(导入)到 Authorities 选项卡。如果您尝试导入非 CA 证书,则会收到“不是证书颁发机构”消息。选择文件后,会出现一个对话框,您可以在其中指定信任设置(何时信任证书)。使网站正常工作的相关设置是“信任此证书以识别网站”。

    在 Chromium 中,您可以在服务器选项卡上添加(导入)证书。但它们最终会出现在“授权”选项卡(CA 证书,选择文件后不会出现信任设置对话框)或“其他”选项卡(如果是非 CA 证书)上。

    在 Firefox 中,您无法准确地将证书添加到“服务器”选项卡。您添加例外。而且您可以信任根本没有扩展的证书(差)。

    自签名证书扩展

    我的系统带有以下证书的默认设置(要添加的扩展):

    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    

    取自/etc/ssl/openssl.cnf,部分v3_ca。更多信息here

    此外,当证书没有 subjectAltName = DNS:$domain 时,Chromium 会认为证书无效。

    非自签名证书扩展

    来自/etc/ssl/openssl.cnf[ usr_cert ]部分:

    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    

    当浏览器信任自签名证书时

    要让 Chromium 信任自签名证书,它必须具有 basicConstraints = CA:truesubjectAltName = DNS:$domain。对于 Firefox 来说,这还不够:

    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    subjectAltName = DNS:$domain
    

    当浏览器信任自己的 CA 颁发的证书时

    Firefox 不需要扩展,但 Chromium 需要 subjectAltName

    openssl备忘单

    openssl genpkey -algorithm RSA -out "$domain".key - 生成私钥(man

    openssl req -x509 -key "$domain".key -out "$domain".crt - 生成自签名证书(man

    如果没有-subj,它将询问有关专有名称 (DN) 的问题,例如通用名称 (CN)、组织 (O)、位置 (L)。您可以“提前”回答他们:-subj "/CN=$domain/O=$org"

    要添加subjectAltName 扩展,您必须有一个指定所有内容的配置,或者在配置中添加一个部分并使用-extensions 开关告诉openssl 其名称:

        -config <(cat /etc/ssl/openssl.cnf - <<END
    [ x509_ext ]
    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    subjectAltName = DNS:$domain
    END
        ) -extensions x509_ext
    

    openssl req -new -key "$domain".key -out "$domain".csr - 生成CSR,可以带-subj选项(man

    openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \ -CA ca.crt -CAkey ca.key -CAcreateserial - 签署 CSR (man)

    没有-CAcreateserial 将无法工作。它创建一个ca.srl 文件,其中保存最后生成的证书的序列号。要添加subjectAltName,您需要-extfile 开关:

        -extfile <(cat <<END
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    subjectAltName = DNS:$domain
    END
        )
    

    openssl req -in $domain.csr -text -noout - 查看企业社会责任 (man)

    openssl x509 -in $domain.crt -text -noout - 查看证书 (man)

    生成自签名证书

    (您需要在 Firefox 中设置一个例外才能正常工作)

    #!/usr/bin/env bash
    set -eu
    org=localhost
    domain=localhost
    
    sudo trust anchor --remove "$domain".crt || true
    
    openssl genpkey -algorithm RSA -out "$domain".key
    openssl req -x509 -key "$domain".key -out "$domain".crt \
        -subj "/CN=$domain/O=$org" \
        -config <(cat /etc/ssl/openssl.cnf - <<END
    [ x509_ext ]
    basicConstraints = critical,CA:true
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    subjectAltName = DNS:$domain
    END
        ) -extensions x509_ext
    
    sudo trust anchor "$domain".crt
    

    生成自己的CA颁发的证书

    #!/usr/bin/env bash
    set -eu
    org=localhost-ca
    domain=localhost
    
    sudo trust anchor --remove ca.crt || true
    
    openssl genpkey -algorithm RSA -out ca.key
    openssl req -x509 -key ca.key -out ca.crt \
        -subj "/CN=$org/O=$org"
    
    openssl genpkey -algorithm RSA -out "$domain".key
    openssl req -new -key "$domain".key -out "$domain".csr \
        -subj "/CN=$domain/O=$org"
    
    openssl x509 -req -in "$domain".csr -days 365 -out "$domain".crt \
        -CA ca.crt -CAkey ca.key -CAcreateserial \
        -extfile <(cat <<END
    basicConstraints = CA:FALSE
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    subjectAltName = DNS:$domain
    END
        )
    
    sudo trust anchor ca.crt
    

    网络服务器配置

    Nginx:

    server {
        listen  443  ssl;
        ssl_certificate  ssl/localhost.crt;
        ssl_certificate_key  ssl/localhost.key;
        ...
    

    莫波:

    carton exec morbo --listen='https://*:3000?cert=localhost.crt&key=localhost.key' \
        site.pl
    

    附:我正在运行 Chromium 65.0.3325.162、Firefox 59.0 和 openssl-1.1.0.g

    窗口

    显然,Windows 没有trust 实用程序。在 Windows 下,有two stores:本地机器和当前用户证书存储。使用本地机器证书存储毫无意义,因为我们让它只为我们当前的用户工作。然后,有子商店。其中两个预定义是最受关注的:受信任的根证书颁发机构和中间证书颁发机构存储。在命令行中通常称为root and CA

    您可以通过 chrome://settings/?search=Manage%20certificates 访问 Chrome 的证书管理器,然后点击管理证书。最受关注的是受信任的根证书颁发机构和中间证书颁发机构选项卡。

    管理证书的一种方法是通过command line

    >rem list Current User > Trusted Root Certification Authorities store
    >certutil.exe -store -user root
    
    >rem list Local Machine > Intermediate Certification Authorities store
    >certutil.exe -store -enterprise CA
    
    >rem GUI version of -store command
    >certutil.exe -viewstore -user CA
    
    >rem add certificate to Current User > Trusted Root Certification Authorities store
    >certutil.exe -addstore -user root path\to\file.crt
    
    >rem delete certificate from Current User > Trusted Root Certification Authorities store by serial number
    >certutil.exe -delstore -user root 03259fa1
    
    >rem GUI version of -delstore command
    >certutil.exe -viewdelstore -user CA
    

    结果如下(本地机器和当前用户证书存储):

    root
        localhost.crt
            error
        ca.crt
            appears in Trusted Root Certification Authorities tab
    CA
        localhost.crt
            doesn't work, appears in Other People tab
        ca.crt
            doesn't work, appears in Intermediate Certification Authorities tab
    

    其他选项包括在资源管理器中双击证书、从 Chrome 的证书管理器导入证书、使用证书 MMC 管理单元(运行 certmgr.msc)或使用 CertMgr.exe

    对于那些安装了grep的人,这里是快速检查证书在哪里的方法:

    >certutil.exe -store -user root | grep "localhost\|^root\|^CA" ^
    & certutil.exe -store -user CA | grep "locahost\|^root\|^CA" ^
    & certutil.exe -store -enterprise root | grep "localhost\|^root\|^CA" ^
    & certutil.exe -store -enterprise CA | grep "localhost\|^root\|^CA"
    

    因此,将 CA 证书安装到 Current User > Trusted Root Certification Authorities 存储似乎是最佳选择。并且确保不要忘记restart your browser

    补充阅读

    OpenSSL
    genpkey
    req
    x509
    OpenSSL Certificate Authority
    Certificates for localhost
    iamaCA - Become your own certificate authority and dispense certifications
    Firefox and Self-Signed Certs
    Bypassing certificate error page in Chrome

    【讨论】:

    • 我在关于让 Chrome 或 Firefox 接受本地证书的问题中添加了一个大赏:stackoverflow.com/q/48969083/470749
    • 感谢您的工作。我是否正确理解现在不可能创建同时满足 Firefox 和 Chrome 的单一自签名证书?
    • @OlegNeumyvakin 在“当浏览器信任自签名证书时”它说 Chrome 可以信任自签名证书。对于 Firefox,如果我没记错的话,你可以添加一个例外。所以这也许是可能的。此外,您可能会发现有趣的 easy-rsa 项目。我遇到了设置 OpenVPN 的问题。它必须简化成为 CA(特别是创建 CA 和服务器证书)。不过没试过。
    • This gist 也很有用。
    【解决方案2】:

    在 chrome 上,可以浏览到 chrome://flags/#allow-insecure-localhost 并启用

    允许从 localhost 加载的资源使用无效证书。 选项

    【讨论】:

      【解决方案3】:

      在您的浏览器中打开此链接并启用它: chrome://flags/#temporary-unexpire-flags-m87

      然后重新启动chrome并搜索localhost,你会在那里找到它。

      【讨论】:

      • 我的 Firefox 拒绝打开链接 :) 至于 Chromium,我那里只有 M86 和 M85。我正在运行 87.0.4280.141。最重要的是,这样你就错过了证书的所有乐趣:)
      • 抱歉,我不确定如何在 Firefox 上修复它 :-( 你是对的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2016-08-24
      • 2018-05-04
      相关资源
      最近更新 更多