当前位置: 首页 > 知识库问答 >
问题:

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

微生慈
2023-03-14

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

# /etc/hosts
127.0.0.1 subdomain.domain.local
  • 如果像过去一样继续,则“安全证书不受信任”。
  • 尝试将其导入Chrome时“不是证书颁发机构”。
  • 导入证书CA后使用证书时“缺少使用者替代名称”

我很确定我在这个过程中错过了什么。请,谁能提供有效的配置,以处理替代名称,以及确切的步骤,以创建相应的CA和证书,以便Chrome和Firefox可以处理我的本地自定义域?

共有1个答案

桂智志
2023-03-14

>

  • 创建文件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

    需要Python 2

      null
    $ sudo apt install libssl1.0.0 -y
    

    第一步是获取系统上可用的openssl.cnf模板。在Ubuntu上,可以在/usr/lib/ssl/openssl.cnf中找到。您可以在MacOS上的/system/library/openssl/和Redhat Variants上的/etc/pki/Tls中找到这一点。

    export prefix="mydomain"
    
    cp /usr/lib/ssl/openssl.cnf $prefix.cnf
    

    $prefix.cnf需要用我们将要生成的证书的特定信息来修改。

    [v3_ca]部分下,添加以下值。对于CA来说,这表示我们正在创建一个用于密钥签名的CA。

    [ v3_ca ]
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid:always,issuer
    basicConstraints = critical, CA:TRUE, pathlen:3
    keyUsage = critical, cRLSign, keyCertSign
    nsCertType = sslCA, emailCA
    
    [ 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_extensions = v3_req
    

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

    现在我们将开始使用OpenSSL创建必要的密钥和证书。首先生成私有/公共RSA密钥对:

    openssl genrsa -aes256 -out ca.key.pem 2048
    
    chmod 400 ca.key.pem
    

    这将使用基于AES256的密码短语对密钥文件进行编码。然后我们需要创建自签名根CA证书。

    openssl req -new -x509 -subj "/CN=myca" -extensions v3_ca -days 3650 -key ca.key.pem -sha256 -out ca.pem -config $prefix.cnf
    
    openssl x509 -in ca.pem -text -noout
    
    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后,我们切换到服务器证书。首先生成私有/公共RSA密钥对:

    openssl genrsa -out $prefix.key.pem 2048
    

    我们没有在这个密钥上加密码短语,仅仅是因为CA是更有价值的目标,并且我们总是可以重新生成服务器证书,但是请放心采取这种额外的预防措施。

    然后创建服务器证书签名请求:

    openssl req -subj "/CN=$prefix" -extensions v3_req -sha256 -new -key $prefix.key.pem -out $prefix.csr
    
    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
    
    openssl x509 -in $prefix.crt -text -noout
    
    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
    

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

    在Chrome设置(Chrome:/settings)中,搜索证书并单击管理证书。在Windows上,这将打开Windows证书管理器,您应该在受信任的根证书颁发机构选项卡上导入ca.pem文件。这相当于通过mmc.exe本地用户受信任根存储(不是计算机级别)中添加它。

  •  类似资料:
    • 我正试图将我的计算机配置为信任用于测试网站的自签名证书。然而,我在Firefox上遇到了一些问题。Chrome和IE都没问题。 我做了以下几点。 使用OpenSSL创建2048位pem rsa密钥和crt 从密钥和crt文件创建pfx文件 使用MMC将pfx导入到服务器上的个人证书存储中 将IIS配置为使用站点的证书 在客户端PC上 null 我还尝试将证书直接添加到Firefox的权限列表中。它

    • 我已经为我的服务器生成了自我签名的证书。然后用设置->安全->安装添加到Android中。 据我所知,在我将证书添加到受信任的列表中之后,它应该可以很好地工作。我是不是漏掉了什么?其思路是通过Android系统添加证书,无需修改应用程序代码。 顺便说一句,我使用进行网络连接。也许我应该启用连接?

    • 当我们过渡到使用已购买的.dev域进行本地开发时,我正在使用以下代码生成证书: 证书在Mac OSX上运行良好,添加到钥匙链访问后,但在ubuntu上,我使用任何浏览器都遇到了问题。

    • 正如标题所说。我开始向站点添加服务工作者,为了使他们工作,他们需要有效的SSL证书。我已经有一段时间让我的本地开发服务器通过https提供一个自签名的证书,尽管Chrome给出了“不安全”的消息,直到现在我才忽略了这个消息。我在这里看到过很多类似的问题(使用localhost),但没有任何与我的设置(在localhost上使用虚拟主机)匹配的问题,而且我尝试过的问题都没有奏效。 我将描述我的设置:

    • MarkFisher.Local使用了无效的安全证书。证书不是来自受信任的源。错误代码:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY 我已按此答案中的建议将设置为。此外,转到首选项>隐私与安全>查看证书,我可以看到我的证书在“授权”选项卡中,并且我已经在“编辑信任”对话框中选中了“此证书可以标识网站”。这个原来没有检查 然而,Firefox拒绝接受该证