如何使浏览器信任localhost SSL证书?

时间:2018-03-29 09:58:37

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

虽然有are similar questions,甚至good answers,但他们要么不关心localhost,要么问一个特定选项/解决方案(自签名与CA)。

有哪些选择?他们如何比较?我这样做吗?

3 个答案:

答案 0 :(得分:9)

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

这是我发现的。在我错误的地方纠正我。

有CA(证书颁发机构)。他们为其他CA(中间CA)或服务器(最终实体证书)颁发证书(签署CSR&#s; s)。其中一些是根权威。他们有自己签发的自签名证书。也就是说,通常存在从服务器证书到根证书的信任链。并且没有人要求证明根证书。因此,OS具有根证书存储(或信任策略存储),系统范围的受信任根证书列表。浏览器拥有自己的可信证书列表,其中包括系统范围列表以及用户信任的证书。

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

要获取证书,请创建CSR(证书签名请求),然后将其发送给CA. CA签署CSR,在此过程中将其转换为可信证书。

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

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

全系统信任证书

当你改变OS'根证书存储,您必须重新启动浏览器。你改变它:

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

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

Firefox并不信任来自OS'的服务器证书。根证书存储,而不是Chromium。两者都信任来自操作系统的CA证书。根证书商店。

在浏览器中信任证书

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

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

在Firefox中,您无法在“服务器”标签中准确添加证书。您添加例外。而且你可以信任那些根本没有扩展(差)的证书。

自签名证书扩展

我的系统附带以下默认设置(要添加的扩展名):

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

取自/etc/ssl/openssl.cnfv3_ca部分。更多信息here

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

非自签名证书扩展

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

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)。您可以提前回答#34; -subj "/CN=$domain/O=$org"

要添加subjectAltName扩展程序,您必须拥有指定所有内容的配置,或者添加一个要配置的部分,并使用openssl告知-extensions其名称切换:

    -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 - 查看CSR(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

Webserver配置

Nginx的:

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

Morbo:

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

P.S。我正在运行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证书安装到当前用户&gt;受信任的根证书颁发机构商店似乎是最佳选择。 确保不要忘记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

答案 1 :(得分:1)

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

允许从本地主机加载的资源使用无效证书。选项

答案 2 :(得分:0)

在浏览器中打开此链接并启用它: https://www.atg.se/spel/2021-01-20/dd/aby-solvalla/avd1

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