Chrome接受自签名localhost证书

我为localhostCN创建了一个自签名的SSL证书。Firefox在最初抱怨之后接受了这个证书,正如预期的那样。然而,Chrome和IE拒绝接受它,即使在将证书添加到可信根下的系统证书存储之后。即使当我在Chrome的HTTPS弹出窗口中单击“查看证书信息”时,证书被列为正确安装,它仍然坚持认为证书不可信。

我该怎么做才能让Chrome接受证书并停止抱怨?

1661384 次浏览

您确定站点的地址与证书相同吗?我对Chrome和自签名证书也有同样的问题,但最终我发现它对证书上域名的验证非常挑剔(应该是这样)。

Chrome没有自己的证书存储,而是使用Windows自己的证书存储。但是Chrome没有提供将证书导入存储的方法,因此您应该改为通过IE添加它们。

在Google中安装证书Chrome

在Internet Explorer中安装证书

还要看一下创建自签名证书的几种不同方法(我假设您使用的是IIS,因为您没有提到)。

如何在IIS 7中创建自签名证书

在Mac上,您可以使用钥匙串访问实用程序将自签名证书添加到系统钥匙串,然后Chrome将接受它。我在这里找到了分步说明:

GoogleChrome、Mac OS X和自签名SSL证书

基本上:

  1. 双击带有X的锁图标并将证书图标拖放到桌面,
  2. 打开此文件(以. cer扩展名结尾);这将打开允许您批准证书的钥匙串应用程序。

Linux

如果您使用的是Linux,您也可以关注以下官方wiki页面:

基本上:

  • 单击带X的锁图标,
  • 选择证书信息
  • 转到详细信息选项卡
  • 单击导出…(另存为文件)

现在,以下命令将添加证书(其中YOUR_FILE是您导出的文件):

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n YOUR_FILE -i YOUR_FILE

要列出所有证书,请运行以下命令:

certutil -d sql:$HOME/.pki/nssdb -L

如果它仍然不起作用,您可能会受到以下bug的影响:问题55050:Ubuntu SSL错误8179

附注:在使用上述命令之前,请确保您有libnss3-tools

如果没有,请通过以下方式安装:

sudo apt-get install libnss3-tools # on Ubuntusudo yum install nss-tools # on Fedora, Red Hat, etc.

作为奖励,您可以使用以下方便的脚本:

$ cat add_cert.shcertutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n $1 -i $1$ cat list_cert.shcertutil -d sql:$HOME/.pki/nssdb -L # add '-h all' to see all built-in certs$ cat download_cert.shecho QUIT | openssl s_client -connect $1:443 | sed -ne '/BEGIN CERT/,/END CERT/p'

用法:

add_cert.sh [FILE]list_cert.shdownload_cert.sh [DOMAIN]

故障排除

  • 使用--auto-ssl-client-auth参数运行Chrome

    google-chrome --auto-ssl-client-auth

这对我有效:

  1. 使用Chrome,通过HTTPS点击服务器上的页面,然后继续经过红色警告页面(假设您还没有这样做)。
  2. 打开Chrome Settings > Show advanced settings > HTTPS/SSL > Manage Certificates
  3. 单击Authorities选项卡并向下滚动以在您提供给证书的组织名称下查找您的证书。
  4. 选择它,单击编辑(:在最新版本的Chrome中,按钮现在是“高级”而不是“编辑”),选中所有框并单击确定。您可能需要重新启动Chrome。

你现在应该在你的页面上得到漂亮的绿色锁。

编辑:我在新机器上再次尝试此操作,仅从红色不受信任的证书页面继续,证书并未出现在管理证书窗口中。我必须执行以下操作:

  1. 在包含不受信任证书的页面上(https://被红色划掉),单击锁>证书信息。在较新版本的chrome上,您必须打开Developer Tools > Security,然后选择View certificate
  2. 单击Details tab > Export。选择PKCS #7, single certificate作为文件格式。
  3. 然后按照我最初的说明进入管理证书页面。单击Authorities tab > Import并选择您将证书导出到的文件,以及确保选择PKCS #7, single certificate作为文件类型
  4. 如果提示认证存储,请选择受信任的根证书颁发机构
  5. 选中所有框并单击确定。重新启动Chrome。

对于测试环境

您可以在启动chrome时使用--ignore-certificate-errors作为命令行参数(在Ubuntu上运行版本28.0.1500.52)。

这将导致它忽略错误并在没有警告的情况下连接。如果您已经运行了一个版本的chrome,则需要在从命令行重新启动之前关闭它,否则它将打开一个新窗口但忽略参数。

我将Intellij配置为在调试时以这种方式启动chrome,因为测试服务器永远不会有有效的证书。

不过,我不建议像这样正常浏览,因为证书检查是一项重要的安全功能,但这可能对某些人有帮助。

更新11/2017:此答案可能不适用于大多数较新版本的Chrome。

更新02/2016:可以找到更好的Mac用户说明这里

  1. 在您要添加的站点上,右键单击地址栏中的红色锁图标:在此处输入图像描述

    1. 单击标记为Connection的选项卡,然后单击证书信息

    2. 单击详细信息选项卡,单击按钮复制到文件…。这将打开证书导出向导,单击Next进入导出文件格式屏幕。

    3. 选择DER编码的二进制X.509(. CER),点击Next

    4. 单击Browse…并将文件保存到您的计算机。将其命名为描述性的名称。单击Next,然后单击Finish

    5. 打开Chrome设置,滚动到底部,然后单击显示高级设置…

    6. HTTPS/SSL下,单击管理证书…

    7. 单击受信任的根认证机构选项卡,然后单击导入…按钮。这将打开证书导入向导。单击下一个进入要导入的文件屏幕。

    8. 单击Browse…并选择您之前保存的证书文件,然后单击Next

    9. 选择将所有证书放在以下存储区中。所选存储区应为受信任的根证书颁发机构。如果不是,请单击浏览…并选中它。单击NextFinish

    10. 单击安全警告上的是。

    11. 重新启动Chrome。

单击URL旁边的小划线锁定图标时,您将获得一个如下所示的框:

输入图片描述

单击证书信息链接后,您将看到以下对话框:

输入图片描述

它告诉您哪个证书存储是正确的,它是受信任的根认证机构存储。

您可以使用其他答案中概述的方法之一将证书添加到该存储或使用:

certutil -addstore -user "ROOT" cert.pem
  • ROOT是前面提到的证书存储的内部名称。
  • cert.pem是自签名证书的名称。

我不得不调整macosx上的Chrome启动器并添加以下脚本。保存如下;

/Applications/Google\Chrome.app/Contents/MacOS/Chrome.command

#!/bin/shRealBin="Google Chrome"AppDir="$(dirname "$0")"exec "$AppDir/$RealBin" --ignore-certificate-errors "$@"

当我开始Chrome这个脚本时,自签名证书没有问题。但是不要使用使用此脚本启动的浏览器浏览网页你不会收到关于无效证书的警告!

如果您是在mac并且没有看到导出选项卡或如何获取证书,这对我有用:

  1. 单击https://之前的锁
  2. 转到“连接”选项卡
  3. 点击“证书信息”

    现在你应该看到这个:当然,不同的信息和你的信息应该被标记为可信的(否则你可能不会在这里)

  4. 拖动那个小证书图标做你的桌面(或任何地方)。

  5. 双击下载的. cer文件,这应该会将其导入您的钥匙串并打开钥匙串访问您的证书列表。

    在某些情况下,这就足够了,您现在可以刷新页面。

    否则:

  6. 双击新添加的证书。
  7. 在信任下拉列表下,将“使用此证书时”选项更改为“始终信任”

现在重新加载有问题的页面,问题应该解决了!希望这有帮助。


编辑Wolph

为了使这更容易,您可以使用以下脚本(来源):

  1. 将以下脚本另存为whitelist_ssl_certificate.ssh

    #!/usr/bin/env bash -e
    SERVERNAME=$(echo "$1" | sed -E -e 's/https?:\/\///' -e 's/\/.*//')echo "$SERVERNAME"
    if [[ "$SERVERNAME" =~ .*\..* ]]; thenecho "Adding certificate for $SERVERNAME"echo -n | openssl s_client -connect $SERVERNAME:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee /tmp/$SERVERNAME.certsudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" /tmp/$SERVERNAME.certelseecho "Usage: $0 www.site.name"echo "http:// and such will be stripped automatically"fi
  2. Make the script executable (from the shell):

    chmod +x whitelist_ssl_certificate.ssh
  3. Run the script for the domain you want (simply copy/pasting the full url works):

    ./whitelist_ssl_certificate.ssh https://your_website/whatever

这是不断出现的事情-特别是对于Mac OS X Yosemite上的GoogleChrome!

值得庆幸的是,我们的一个开发团队今天给我发了这个链接,该方法工作可靠,同时仍然允许您控制接受哪些站点的证书。

https://www.reddit.com/r/sysadmin/comments/3ercx4/chrome_shortcut_past_the_your_connection_is_not/cthporl

杰苏利帖子:

如果您不想为内部证书而烦恼…

  1. 在地址栏中键入chrome://flags/
  2. 滚动到或搜索记住决策以在指定的时间长度内继续处理SSL错误。
  3. 选择记住三个月。

localhost

只需将其粘贴到您的chrome中:

chrome://flags/#allow-insecure-localhost

您应该会看到突出显示的文本:

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

单击启用

其他网站

尝试在窗口的任何位置键入thisisunsafe浏览器应该允许您访问页面

-OR-

对于避免神秘命令,专业知识和手动步骤的本地自签名证书,请尝试这个答案中的#0

这对我很有用。见:http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/#.Vcy8_ZNVhBc

在地址栏中,单击带有X的小锁。这将弹出一个小信息屏幕。单击显示“证书信息”的按钮。

单击并将图像拖到桌面。它看起来像一个小证书。

双击它。这将打开钥匙串访问实用程序。输入您的密码以解锁它。

确保将证书添加到系统钥匙串,而不是登录钥匙串。单击“始终信任”,即使这似乎没有任何作用。

添加后,双击它。您可能需要再次进行身份验证。

展开“信任”部分。

“使用此证书时”设置为“始终信任”

我继续使用bjnord建议的过程:GoogleChrome、Mac OS X和自签名SSL证书

博客中显示的内容不起作用。

然而,博客上的一条评论是黄金:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain site.crt

您需要关注有关如何获取cert文件的博客,之后您可以使用上面的命令并且应该很好。

正如有人所指出的,您需要重新启动所有Chrome,而不仅仅是浏览器窗口。

chrome://restart

SSL/HTTPSlocalhost修复Mac/osx:

  1. 尝试打开httpslocalhost环境时,单击地址栏中带十字的红锁。将打开一个窗口,其中包含有关证书的一些信息。

  2. 点击“详细信息”信息窗口

  3. chrome Developer工具将在“安全”选项卡上打开。单击查看证书证书镜像
  4. 将其添加到您的“系统”钥匙串(而不是默认选择的“登录”钥匙串)。

  5. 再次打开钥匙串并找到证书。单击它并确保您“信任”所有人。

  6. 重新启动chrome,它应该可以工作。

修复Windows上的Chrome。

首先,您需要导出证书。

  • 在浏览器中找到URL。URL的“https”段将是用红线划掉,左边会有一个锁符号。
  • 右键单击划掉的“https”段。
  • 您将看到一个包含各种信息的信息窗口
  • 点击“详情”。
  • 导出证书,按照说明接受默认设置。

要导入

  • 转到Chrome设置
  • 点击“高级设置”
  • 在HTTPS/SSL下单击“管理证书”
  • 转到“受信任的根证书颁发机构”
  • 点击“导入”
  • 将出现一个弹出窗口,询问您是否要安装此证书。单击“是”。

对于Windows上的开发目的,您可以
添加到Chrome快捷方式标志--ignore-certificate-errors

它预计会忽略证书错误并允许您访问无效证书网站。
https://support.opendns.com/entries/66657664中更详细的说明。

在此处输入图片描述

更新中 Apr 23/2020

Chromium团队推荐

https://www.chromium.org/Home/chromium-security/deprecating-powerful-features-on-insecure-origins#TOC-Testing-Powerful-Features

快速超级简单的解决方案

有一个秘密的旁路短语,可以输入到错误页面,Chrome继续,尽管安全错误:ThissunSafe(在早期版本的Chrome,键入badidea,甚至更早,危险)。

来源:

https://chromium.googlesource.com/chromium/src/+/d8fc089b62cd4f8d907acff6fb3f5ff58f168697%5E%21/

(注意window.atob('dGhpc2lzdW5zYWZl')解析为thisisunsafe

源代码的最新版本是@https://chromium.googlesource.com/chromium/src/+/refs/heads/master/components/security_interstitials/core/browser/resources/interstitial_large.jswindow.atob函数可以在JS控制台中执行。

关于Chrome团队为什么改变旁路短语(第一次)的背景:

https://bugs.chromium.org/p/chromium/issues/detail?id=581189

如果一切都失败了(解决方案#1)

对于快速一次性,如果“无论如何继续”选项不可用,也不是旁路短语工作,这个黑客工作得很好:

  1. 通过启用此标志允许来自localhost的证书错误(注意Chrome更改标志值后需要重新启动):

    chrome://flags/#allow-insecure-localhost

    (以及@Chris的投票答案https://stackoverflow.com/a/31900210/430128

  2. 如果您要连接的站点是localhost,则完成。否则,设置TCP隧道在本地侦听端口8090并在端口443上连接到broken-remote-site.com,确保您安装了socat并在终端窗口中运行类似以下内容:

    socat tcp-listen:8090,reuseaddr,fork tcp:broken-remote-site.com:443

  3. 转到浏览器中的https://localhost:8090。

如果一切都失败了(解决方案#2)

类似于“如果所有其他方法都失败(解决方案#1)”,这里我们使用ngrok配置本地服务的代理。因为您可以通过TLS访问ngrok超文本传输协议隧道(在这种情况下,ngrok使用有效证书终止它),或者通过非TLS端点,浏览器不会抱怨无效证书。

下载并安装ngrok,然后通过ngrok.io公开它:

ngrok http https://localhost

Ngrok将启动并为您提供一个可以连接的主机名,所有请求都将通过隧道返回到您的本地机器。

我遇到了同样的问题:我已将证书安装到Windows的受信任的根机构存储中,Chrome仍然拒绝证书,错误为ERR_CERT_COMMON_NAME_INVALID。请注意,当证书未正确安装在存储中时,错误为ERR_CERT_AUTHORITY_INVALID

正如错误名称这一评论这个问题所暗示的那样,问题出在证书中声明的域名上。我使用当生成证书时提示输入“通用名称”时,我必须输入域名访问该站点(在我的情况下为localhost)。我使用chrome://restart重新启动Chrome,它终于对这个新证书感到满意。

我该怎么做才能让Chrome接受证书并停止抱怨?

您应该创建一个PKI;

  1. 自签名根CA。
  2. 子/中间证书[由根CA签名]。
  3. 普通/最终实体证书[由根CA或子CA签名]
    • commonNamesubjectAltName(SAN)为localhost。
    • 还包括https://localhost/作为SAN中的URI。
  4. 在Windows操作系统中导入/安装该根CA作为“受信任的根证书颁发机构”。
    • 因为你提到IE:GoogleChrome正在使用相同的资源,同时寻找证书链。
  5. 将该最终实体证书安装为您的Web服务器证书,它就会停止抱怨该错误消息。

希望这有帮助。

CHROME 58+更新(2017-04-19发布)

自58Chrome起,仅使用commonName被移除识别主机的能力。证书现在必须使用subjectAltName来识别其主机。请参阅进一步的这里讨论bug追踪器。过去,subjectAltName仅用于多主机证书,因此一些内部CA工具不包括它们。

如果你的自签证书在过去运作良好但是突然在Chrome58中开始产生错误,这就是原因。

因此,无论您使用什么方法来生成自签名证书(或由自签名CA签名的证书),请确保服务器的证书包含subjectAltName和正确的DNS和/或IP条目/条目,即使只是针对一个宿主

对于openssl,这意味着您的OpenSSL配置(Ubuntu上的/etc/ssl/openssl.cnf)应该具有与单个主机类似的内容:

[v3_ca]   # and/or [v3_req], if you are generating a CSRsubjectAltName = DNS:example.com

或者对于多个主机:

[v3_ca]   # and/or [v3_req], if you are generating a CSRsubjectAltName = DNS:example.com, DNS:host1.example.com, DNS:*.host2.example.com, IP:10.1.2.3

在Chrome的cert查看器(已移至F12下的“Security”选项卡)中,您应该会看到它在Extensions下列出为Certificate Subject Alternative Name

Chrome证书查看器

在Mac上,您可以通过执行以下操作在系统级别创建Chrome和Safari完全信任的证书:

    # create a root authority cert./create_root_cert_and_key.sh    
# create a wildcard cert for mysite.com./create_certificate_for_domain.sh mysite.com    
# or create a cert for www.mysite.com, no wildcards./create_certificate_for_domain.sh www.mysite.com www.mysite.com

上面使用以下脚本和支持文件v3.ext避免主题替代名称丢失错误

如果您想使用自己的根权限创建一个完全受信任的新自签名证书,您可以使用这些脚本来完成。

create_root_cert_and_key.sh

    #!/usr/bin/env bashopenssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

create_certificate_for_domain.sh

    #!/usr/bin/env bash    
if [ -z "$1" ]thenecho "Please supply a subdomain to create a certificate for";echo "e.g. www.mysite.com"exit;fi    
if [ ! -f rootCA.pem ]; thenecho 'Please run "create_root_cert_and_key.sh" first, and try again!'exit;fiif [ ! -f v3.ext ]; thenecho 'Please download the "v3.ext" file and try again!'exit;fi    
# Create a new private key if one doesnt exist, or use the xeisting one if it doesif [ -f device.key ]; thenKEY_OPT="-key"elseKEY_OPT="-keyout"fi    
DOMAIN=$1COMMON_NAME=${2:-*.$1}SUBJECT="/C=CA/ST=None/L=NB/O=None/CN=$COMMON_NAME"NUM_OF_DAYS=825openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csrcat v3.ext | sed s/%%DOMAIN%%/"$COMMON_NAME"/g > /tmp/__v3.extopenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.ext    
# move output files to final filenamesmv device.csr "$DOMAIN.csr"cp device.crt "$DOMAIN.crt"    
# remove temp filerm -f device.crt;    
echoecho "###########################################################################"echo Done!echo "###########################################################################"echo "To use these files on your server, simply copy both $DOMAIN.csr and"echo "device.key to your webserver, and use like so (if Apache, for example)"echoecho "    SSLCertificateFile    /path_to_your_files/$DOMAIN.crt"echo "    SSLCertificateKeyFile /path_to_your_files/device.key"

v3.ext

    authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentsubjectAltName = @alt_names    
[alt_names]DNS.1 = %%DOMAIN%%

还有一步-如何使自签名证书完全信任Chrome/Safari

要允许自签名证书在Chrome和Safari中完全受信任,您需要将新的证书颁发机构导入Mac。为此,请按照以下说明或此常规流程在mitm代理网站上中的更详细说明进行操作:

您可以在命令行使用以下两种方式之一执行此操作,该命令将提示您输入密码:

$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain rootCA.pem

或者使用Keychain Access应用程序:

  1. 打开钥匙串访问
  2. 在“钥匙串”列表中选择“系统”
  3. 在“类别”列表中选择“证书”
  4. 选择“文件|导入项目…”
  5. 浏览到上面创建的文件“rootCA.pem”,选择它,然后单击“打开”
  6. 在“证书”列表中选择您新导入的证书。
  7. 单击“i”按钮,或右键单击您的证书,然后选择“获取信息”
  8. 扩展“信任”选项
  9. 将“使用此证书时”更改为“始终信任”
  10. 关闭对话框,系统将提示您输入密码。
  11. 关闭并重新打开使用您的目标域的任何选项卡,它将被安全加载!

作为奖励,如果您需要Java客户端来信任证书,您可以通过将证书导入java密钥库来做到这一点。请注意,如果证书已经存在,这将从密钥库中删除证书,因为它需要在情况发生变化时更新它。当然,它只对导入的证书这样做。

import_certs_in_current_folder_into_java_keystore.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";
function running_as_root(){if [ "$EUID" -ne 0 ]then echo "NO"exitfi
echo "YES"}
function import_certs_to_java_keystore{for crt in *.crt; doecho prepping $crtkeytool -delete -storepass changeit -alias alias__${crt} -keystore $KEYSTORE;keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTOREechodone}
if [ "$(running_as_root)" == "YES" ]thenimport_certs_to_java_keystoreelseecho "This script needs to be run as root!"fi

WINDOWS JUN/2017 Windows Server 2012

我遵循@Brad Parks的回答。在Windows上,您应该在受信任的根证书颁发机构存储中导入rootCA.pem。

我做了以下步骤:

openssl genrsa -out rootCA.key 4096openssl req -x509 -new -nodes -key rootCA.key -newkey rsa:4096 -sha256 -days 1024 -out rootCA.pemopenssl req -new -newkey rsa:4096 -sha256 -nodes -keyout device.key -out device.csropenssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 2000 -sha256 -extfile v3.ext

v3.ext:

authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentsubjectAltName = @alt_names
[alt_names]DNS.1 = localhostIP.1 = 192.168.0.2IP.2 = 127.0.0.1

然后,在我的情况下,我有一个自托管的Web应用程序,所以我需要将证书与IP地址和端口绑定,证书应该在我的商店中包含私钥信息,所以我导出为pfx格式。

openssl pkcs12 -export -out device.pfx -inkey device.key -in device.crt

使用mmc控制台(文件/添加或删除管理单元/证书/添加/计算机帐户/LocalComputer/OK)我在个人商店中导入了pfx文件。

后来我使用这个命令绑定证书(你也可以使用HttpConfig工具):

netsh http add sslcert ipport=0.0.0.0:12345 certhash=b02de34cfe609bf14efd5c2b9be72a6cb6d6fe54 appid={BAD76723-BF4D-497F-A8FE-F0E28D3052F4}

certhash=证书指纹

appid=GUID(您的选择)

首先,我尝试以不同的方式导入可信根证书颁发机构上的证书“device.crt”,但我仍然收到相同的错误:

在此处输入图片描述

但是我意识到我应该导入根权限证书而不是域证书。所以我使用mmc控制台(文件/添加或删除管理单元/证书/添加/计算机帐户/本地计算机/确定)我在受信任的根证书颁发机构存储中导入了rootCA.pem。

在此处输入图片描述

重新启动Chrome并开始工作。

localhost:

在此处输入图片描述

或者使用IP地址:

在此处输入图片描述

我唯一不能实现的是,它有过时的密码(图片上的红色正方形)。

使用makecert,无法添加SAN信息。使用New-SelfSigned证书(Powershell),您可以添加SAN信息,它也可以工作。

从58Chrome开始,由于缺少SAN,我开始在macOS上获得证书错误。这是如何再次获得地址栏上的绿色锁。

  1. 使用以下命令生成新证书:

    openssl req \-newkey rsa:2048 \-x509 \-nodes \-keyout server.key \-new \-out server.crt \-subj /CN=*.domain.dev \-reqexts SAN \-extensions SAN \-config <(cat /System/Library/OpenSSL/openssl.cnf \<(printf '[SAN]\nsubjectAltName=DNS:*.domain.dev')) \-sha256 \-days 720
  2. Import the server.crt into your KeyChain, then double click in the certificate, expand the Trust, and select Always Trust

Refresh the page https://domain.dev in Google Chrome, so the green lock is back.

这是一个仅使用Java8keytool.exe而不是openssl的解决方案:

@echo offset PWD=changeitset DNSNAME=%COMPUTERNAME%
echo create ca keykeytool -genkeypair -alias ca -keystore test.jks -keyalg RSA -validity 3650 -ext bc:critical=ca:true -dname "CN=CA" -storepass:env PWD -keypass:env PWDecho generate cert request for ca signingkeytool -certreq -keystore test.jks -storepass:env PWD -alias ca -file ca.csr -ext bc:critical=ca:trueecho generate signed certkeytool -gencert -keystore test.jks -storepass:env PWD -alias ca -infile ca.csr -outfile ca.cer -validity 3650 -ext bc:critical=ca:trueecho CA created. Import ca.cer in windows and firefox' certificate store as "Trusted CA".pause
echo create server cert key for %DNSNAME%keytool -genkeypair -alias leaf -keystore test.jks -keyalg RSA -validity 3650 -ext bc=ca:false -ext san=dns:%DNSNAME%,dns:localhost,ip:127.0.0.1 -dname "CN=Leaf" -storepass:env PWD -keypass:env PWDecho generate cert requestkeytool -certreq -keystore test.jks -storepass:env PWD -alias leaf -file leaf.csr -ext bc=ca:false -ext san=dns:%DNSNAME%,dns:localhost,ip:127.0.0.1echo generate signed certkeytool -gencert -keystore test.jks -storepass:env PWD -alias ca -infile leaf.csr -outfile leaf.cer -validity 3650 -ext bc=ca:false -ext san=dns:%DNSNAME%,dns:localhost,ip:127.0.0.1
rem see contentrem keytool -printcert -file leaf.cer -storepass:env PWD
echo install in orig keystorekeytool -importcert -keystore test.jks -storepass:env PWD -file leaf.cer -alias leaf
echo content of test.jks:keytool -list -v -storepass:env PWD -keystore test.jkspause

您也可以使用管道而不是文件,但是使用文件,如果出现问题,您可以检查中间结果。SSL在Windows上使用IE11、Edge、FF54、Chrome60和Android上的Chrome60进行了测试。

请在使用脚本之前更改默认密码。

这篇文章已经充斥着回复,但我根据其他一些答案创建了一个bash脚本,以便在Chrome中更容易生成自签名TLS证书有效(在Chrome 65.x中测试)。希望对其他人有用。

自签名tls bash脚本

安装(和信任)证书后,不要忘记重新启动Chrome(chrome://restart


另一个值得查看的工具是CloudFlare的cfssl工具包:

cfssl

上面的答案都没有帮助我在Windows 10上进行本地测试

https://localhost:<port>

然而,我发现这个页面,指示另一个标志传递:

https://www.chromium.org/blink/serviceworker/service-worker-faq

如果您想使用自签名证书在https://localhost上进行测试,请执行:

$./chromelocalhosthttps://localhost

这并没有消除红色警告,但它确实使我能够使用仅限https的功能,如服务工作者和Web推送通知。

我为自己解决了这个问题,而没有更改任何具有适当SSL认证的浏览器上的设置。我使用Mac,所以它需要对我的ssl认证进行钥匙串更新。我必须在ssl认证中添加主题alt名称才能让chrome接受它。截至今天,这是Chrome版本号:62.0.3202.94

我的示例是易于使用的命令和配置文件:

添加这些文件,这个示例都在一个根目录中

ssl.conf

[ req ]default_bits       = 4096distinguished_name = req_distinguished_namereq_extensions     = req_ext
[ req_distinguished_name ]countryName                 = Country Name (2 letter code)stateOrProvinceName         = State or Province Name (full name)localityName                = Locality Name (eg, city)organizationName            = Organization Name (eg, company)commonName                  = Common Name (e.g. server FQDN or YOUR name)commonName_max              = 64
[ req_ext ]subjectAltName = @alt_names
[alt_names]DNS.1   = localhost

运行命令创建证书:

openssl req -newkey rsa:4096 -nodes -keyout key.pem -x509 -days 3650 -out certificate.pem -extensions req_ext -config ssl.conf -subj '/CN=localhost/O=Stackflow/C=US/L=Los Angeles/OU=StackflowTech'

仅适用于Mac添加可信认证(必需):

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ./certificate.pem

对于windows,您必须找到如何在本地独立验证我们的ssl证书。我不使用Windows。对不起windows伙计和女孩。

我使用的是express.js的node.js服务器,只需要我的密钥和认证,如下所示:

app.js

const https = require('https');const Express = require('express');const fs = require('fs');const app = new Express();const server = https.createServer({key: fs.readFileSync('./key.pem'),cert: fs.readFileSync('./certificate.pem'),}, app);server.listen(3000);

我可能会在将来为其他后端帧执行此操作,因此我可以在将来为其他人更新示例。但这是我Node.js该问题的修复。清除浏览器缓存并在https://上运行您的应用程序

以下是在Mac用户的Node.js服务器上运行https://localhost的示例:

https://github.com/laynefaler/Stack-Overflow-running-HTTPS-localhost

编码快乐!

单击页面上的任何位置并键入BYPASS_SEQUENCE

thisisunsafe”是Chrome版本65的BYPASS_SEQUENCE

"badidea"Chrome版本62-64。

danger”用于早期版本的Chrome

您不需要查找输入字段,只需输入它。感觉很奇怪,但它正在工作。

我在Mac High Sierra上尝试过。

要仔细检查他们是否再次更改它,请转到最新的chromium源代码

要寻找BYPASS_SEQUENCE,目前看起来是这样的:

var BYPASS_SEQUENCE = window.atob('dGhpc2lzdW5zYWZl');

现在他们伪装了它,但要看到真正的BYPASS_SEQUENCE您可以在浏览器控制台中运行以下行。

console.log(window.atob('dGhpc2lzdW5zYWZl'));

假设您使用的是Mac OSX,您也可以在Safarihttps://localhost:8080/css/app.css中打开有问题的URL,允许证书。重新启动Chrome,它就会工作。

当我尝试在浏览器中导入证书时,它对我不起作用……在chrome中打开开发人员工具>安全性,然后选择查看证书。单击详细信息选项卡并将其导出。

//linux

sudo apt-get install libnss3-tools
certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n [EXPORTED_FILE_PATH] -i [EXPORTED_FILE_PATH]

运行此命令,如果您看到您刚刚导入的文件,您就可以开始了!

 certutil -d sql:$HOME/.pki/nssdb -L

//视窗操作系统

Start => run => certmgr.msc

在左侧选择受信任的根证书颁发机构=>个人。单击操作选项卡=>所有操作/导入,然后选择您之前从浏览器导出的文件

别忘了重启chrome!!!

祝你好运!;)

对于MacOS上的Chrome,如果您准备了证书:

  • 退出Chrome(cmd+Q)。
  • 启动Keychain Access应用程序并打开“证书”类别。
  • 将您的证书文件拖到Keychain Access窗口上,然后键入证书文件的密码。
  • 双击您的证书并展开“信任”列表。
    • 在行“使用此证书时”中,选择“始终信任”。
    • 关闭此内容并键入您的密码。
  • 启动Chrome并清除所有缓存。
  • 检查一切正常。

我尝试了一切,是什么让它工作:导入时,选择正确的类别,即受信任的根证书颁发机构

(对不起,这是德语,但只是按照图片)

在此处输入图片描述

我成功地按照kellen的答案进行了重要的来自Toby J的更新,但不得不进行此修改:

创建自签名证书时,需要将新的subjectAltName字段放在v3_ca扩展名下,而不是v3_req下。我将/etc/ssl/openssl.conf复制到一个临时文件中,然后在[ v3_ca ]下添加了subjectAltName = DNS:*.example.com行。然后将该文件传递给cert创建命令,类似于

  openssl req -x509 -nodes -newkey rsa:2048 \-config /tmp/openssl-revised.cfg \-keyout example.com.key -out example.com.crt

并遵循凯伦的更新步骤。

mkdir CAopenssl genrsa -aes256 -out CA/rootCA.key 4096openssl req -x509 -new -nodes -key CA/rootCA.key -sha256 -days 1024 -out CA/rootCA.crt
openssl req -new -nodes -keyout example.com.key -out domain.csr -days 3650 -subj "/C=US/L=Some/O=Acme, Inc./CN=example.com"openssl x509 -req -days 3650 -sha256 -in domain.csr -CA CA/rootCA.crt -CAkey CA/rootCA.key -CAcreateserial -out example.com.crt -extensions v3_ca -extfile <(cat <<-EOF[ v3_ca ]subjectAltName = DNS:example.comEOF)

在LinuxChromium上管理SSL证书的GUI不适合我。然而,他们的文档给出了正确的答案。诀窍是运行下面导入自签名SSL证书的命令。只需更新<certificate-nickname>certificate-filename.cer的名称,然后重新启动chromium/chrome。

从文档:

在Linux,Chromium使用NSS共享数据库。如果内置管理器不适合您,那么您可以使用NSS命令行工具配置证书。

拿上工具

  • Debian/Ubuntu:sudo apt-get install libnss3-tools

  • Fedora:su -c "yum install nss-tools"

  • Gentoo:su -c "echo 'dev-libs/nss utils' >> /etc/portage/package.use && emerge dev-libs/nss"(您需要使用nss前缀启动以下所有命令,例如nsscertutil。)打开:sudo zypper install mozilla-nss-tools

要信任自签名服务器证书,我们应该使用

certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n <certificate-nickname> -i certificate-filename.cer

列出所有证书

certutil -d sql:$HOME/.pki/nssdb -L

TRUSTARGS是三个由零个或多个字母字符组成的字符串,用逗号分隔。它们定义了证书在SSL、电子邮件和对象签名时应如何受信任,并在certutil文档或Meena关于信任标志的博客文章中进行了解释。

为SSL客户端身份验证添加个人证书和私钥使用命令:

pk12util -d sql:$HOME/.pki/nssdb -i PKCS12_file.p12

导入存储在PKCS#12文件中的个人证书和私钥。个人证书的TRUSTARGS将设置为“u, u, u”。

删除证书certutil -d sql:$HOME/.pki/nssdb -D -n <certificate nickname>

摘自:https://chromium.googlesource.com/chromium/src/+/HEAD/docs/linux_cert_management.md

对于Fedora,Ubuntu,Linux,如果您在使用gui添加证书以添加新的根权限时遇到example.com Not a Certification authority错误。如果您想信任服务器自签名证书,它不能提及无效的权威…即使它本身。我只能通过信任我的权限并使用该权限密钥签署服务器证书来使其工作。

这是它接受的自签名CA证书。这是我找到解决cert_authority_invalid问题的唯一方法,我尝试了几个小时让它接受自签名终端证书,没有雪茄。UI将接受自签名权限,只要它声明为CA:TRUE。之后,所有由该密钥使用正确的DN签名的证书都将被chrome接受,而无需独立添加它们。

openssl req -new -x509 -extensions v3_req -days 8440 -config ca.conf -key rockstor.key -out rockstor.cert

[req]distinguished_name=dnreq_extensions=v3_reqprompt = no
[v3_req]basicConstraints=CA:TRUE,pathlen:0keyUsage = keyEncipherment, dataEnciphermentextendedKeyUsage = serverAuth, clientAuthsubjectAltName=@alt_names
[alt_names]DNS.1 = ca.tdpowerskills.com
[dn]C = USST = LAL = AlexandriaO = TDPS Certification AuthorityOU = LEARNOPSCN = ca.tdpowerskills.com

openssl req -new -x509 -extensions v3_req -days 8440 -config config.conf -key rockstor.key -out rockstor.cert

[req]distinguished_name=dnreq_extensions=v3_reqprompt = no
[v3_req]basicConstraints=CA:FALSEkeyUsage = keyEncipherment, dataEnciphermentextendedKeyUsage = serverAuth, clientAuthsubjectAltName=@alt_namesissuerAltName=DNS:ca.tdpowerskills.com
[alt_names]DNS.1 = big.tdps.app
[dn]C = USST = LAL = AlexandriaO = TDPS Certification AuthorityOU = LEARNOPSCN = ca.tdpowerskills.com

如果这不起作用:

  • chrome://restart重新启动

  • 尝试使用Firefox获取有关错误的更多详细信息,它倾向于更好地解释错误……而chrome会说,ERR_CERTIFICATE_INVALID,Firefox会抛出:MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY。

  • 请记住,chrome现在需要主题备用名称,几乎忽略了CN。

对于其他人:

  • certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n <nickname> -i <my.crt>//对于服务器服务器

  • certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n <nickname> -i <my.crt> for CA'shttps://blogs.oracle.com/meena/about-trust-flags-of-certificates-in-nss-database-that-can-be-modified-by-certutil

  • 对于Firefox,添加异常证书的UI确实有效,并且一旦您这样做,它就会信任它。

  • 也许你在/etc/pki/tls/openssl.cnf中有一些时髦的设置,它们会与你的配置合并。

  • 也许您没有向配置或命令行添加扩展,例如v3_req

  • 请注意,我的方法通过仅使用权限密钥对证书进行签名并添加开发服务器的详细信息来绕过对CSR的需求。CSR允许更多密钥以实现实际安全性。

  • 我尝试了所有方法,但chrome需要一个具有基本约束CA: true集的权限。服务器证书都必须由有效的权限签名……即使这只是他们自己使用CA: true签名的另一个证书。

允许不安全的localhost通过这个方法工作得很好chrome://的标志/#允许-不安全-localhost

只是您需要创建您的开发主机名来xxx.localhost.

要在Windows中创建Chromev58及更高版本信任的自签名证书,请使用提升的权限启动Powershell并键入:

New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -Subject "fruity.local" -DnsName "fruity.local", "*.fruity.local" -FriendlyName "FruityCert" -NotAfter (Get-Date).AddYears(10)#notes:#    -subject "*.fruity.local" = Sets the string subject name to the wildcard *.fruity.local#    -DnsName "fruity.local", "*.fruity.local"#         ^ Sets the subject alternative name to fruity.local, *.fruity.local. (Required by Chrome v58 and later)#    -NotAfter (Get-Date).AddYears(10) = make the certificate last 10 years. Note: only works from Windows Server 2016 / Windows 10 onwards!!

执行此操作后,证书将保存到个人\证书存储下的本地计算机证书中。

您想将此证书复制到受信任的根证书颁发机构\证书存储。

一种方法:单击Windows开始按钮,然后键入certlm.msc。然后根据下面的屏幕截图将新创建的证书拖放到受信任的根证书颁发机构\证书存储中。输入图片描述

我的解决方案和解释:

我有使用IIS资源工具包工具SelfSSL.exe创建的自签名证书。在我本地计算机上的证书列表中,我看到这个自签名证书只有一个目的服务器认证。所以我创建了新的自签名证书,用于两个目的:服务器认证客户端认证。现在Chrome不再抱怨了。

这篇文章显示了许多生成自签名证书的方法。请注意,并非所有选项都允许您指定证书用途。我使用PowerShell的方式:

$cert = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname company.co.nz

注意:如本凯伦的回答所述Chrome允许您设置证书的用途,但是如果没有考虑到最后一个用途,IMO将无法为证书添加新用途。

Filippo Valsorda为很多信托商店编写了一个跨平台工具#0。我想他写它的原因与这个问题有很多答案的原因相同:为受信任的根CA签署的SubjectAltName证书做“正确”的事情是一件痛苦的事。

mkcert包含在Windows、macOS和几种Linux风格的主要软件包管理系统中。测试强大的功能的第4步中的Chromium文档中也提到了它。

mkcert

mkcert是制作本地可信开发证书的简单工具。它不需要配置。

$ mkcert -install
Created a new local CA at "/Users/filippo/Library/Application Support/mkcert" 💥The local CA is now installed in the system trust store! ⚡️The local CA is now installed in the Firefox trust store (requires browser restart)! 🦊
$ mkcert example.com "*.example.com" example.test localhost 127.0.0.1 ::1
Using the local CA at "/Users/filippo/Library/Application Support/mkcert" ✨
Created a new certificate valid for the following names 📜- "example.com"- "*.example.com"- "example.test"- "localhost"- "127.0.0.1"- "::1"
The certificate is at "./example.com+5.pem" and the key at "./example.com+5-key.pem" ✅
  1. 在受信任的根CA存储中添加CA证书。

  2. 转到chrome并启用此标志!

chrome://flags/#allow-insecure-localhost

最后,只需使用*. me域或任何有效域(如*. com和*. net)并将它们维护在主机文件中。对于我的本地开发人员,我使用*. me或*. com,主机文件维护如下:

  1. 添加到主机。C:/windows/system 32/驱动程序/etc/host

    127.0.0.1 nextwebapp.me

备注:如果执行此操作时浏览器已经打开,则错误将继续显示。因此,请关闭浏览器并重新开始。更好的是,隐身或启动新会话以立即生效。

通过只有5个#0命令,你可以做到这一点。

请不要更改您的浏览器安全设置。

使用以下代码,您可以(1)成为自己的CA,(2)然后将您的SSL证书作为CA签名。(3)然后将CA证书(而不是SSL证书,它会进入您的服务器)导入Chrome/Chromium。(是的,这甚至适用于Linux。)

注意:对于Windows,一些报告说openssl必须与winpty一起运行以避免崩溃。

####################### Become a Certificate Authority######################
# Generate private keyopenssl genrsa -des3 -out myCA.key 2048# Generate root certificateopenssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem
####################### Create CA-signed certs######################
NAME=mydomain.example # Use your own domain name# Generate a private keyopenssl genrsa -out $NAME.key 2048# Create a certificate-signing requestopenssl req -new -key $NAME.key -out $NAME.csr# Create a config file for the extensions>$NAME.ext cat <<-EOFauthorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentsubjectAltName = @alt_names[alt_names]DNS.1 = $NAME # Be sure to include the domain name here because Common Name is not so commonly honoured by itselfDNS.2 = bar.$NAME # Optionally, add additional domains (I've added a subdomain here)IP.1 = 192.168.0.13 # Optionally, add an IP address (if the connection which you have planned requires it)EOF# Create the signed certificateopenssl x509 -req -in $NAME.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \-out $NAME.crt -days 825 -sha256 -extfile $NAME.ext

总结:

  1. 成为CA
  2. 使用您的CA cert+密钥签署您的证书
  3. 在Chrome设置(设置>管理证书>权限>导入)中将myCA.pem导入为“权限”(没有导入“您的证书”)
  4. 使用服务器中的$NAME.crt$NAME.key文件

额外步骤(至少对于Mac):

  1. 在“文件>导入文件”处导入CA证书,然后在列表中找到它,右键单击它,展开“>信任”,然后选择“始终”
  2. basicConstraints=CA:FALSE下面添加extendedKeyUsage=serverAuth,clientAuth,并确保在请求设置时将“公共名称”设置为与$NAME相同

你可以检查你的工作确保证书正确构建:

openssl verify -CAfile myCA.pem -verify_hostname bar.mydomain.example mydomain.example.crt

截至2020年3月,在使用Chrome81的MacOS Catalina上,一旦您使用如上所述的openssl创建有效证书,这种情况就会发生变化。

首先,我使用Safari浏览我的网站,然后单击警告页面底部的链接,允许我无论如何访问该网站。这将证书添加到我的Mac钥匙串(即Keychain.app)。然后Safari让我查看页面。Chrome显示证书是受信任的,但不允许我查看页面。我继续得到CERTIFICATE_INVALID错误。

在钥匙串中,选择左下角窗格中的所有项目。然后搜索localhostDNS名称(即myhost.example.com)。

双击您的证书。它将打开您的证书的编辑对话框。

将“使用此证书时”更改为“始终信任”

这完全违反直觉,因为SSL已经设置为始终信任,大概是在添加证书时Safari。Chrome只有在我全局更改为始终信任后才开始工作。当我将其更改回来时,它停止工作。

在这里,我的解决方案WINDOWS可能适用于Linux

git有openssl

C:\Program Files\Git\usr\bin\openssl.exe.

导航到C:\Program Files\Git\usr\bin\但最好添加到PATH

为证书创建一个文件夹
创建一个文件req.cnf
改变我公司的价值观
不要删除

alt_names[alt_names]
DNS.1=localhost
Chrome抱怨

C=CA
CA是两个字母的国家代码CA=加拿大,美国…
ST=ON=安大略省

req.cnf

[req]distinguished_name = req_distinguished_namex509_extensions = v3_reqprompt = no[req_distinguished_name]C = CAST = ONL = TorontoO = MyCompanyOU = MyDivisionCN = localhost[v3_req]keyUsage = critical, digitalSignature, keyAgreementextendedKeyUsage = serverAuthsubjectAltName = @alt_names[alt_names]DNS.1 = localhostDNS.2 = www.mydomainname.comDNS.3 = mydomainname.com

在CMD中创建证书

 openssl req -x509 -nodes -days 365 -newkey rsa:2048  -keyout server.key -out server.crt -config req.cnf -sha256
cat server.crt server.key > server.pem

覆盖开发证书

 yourproject\node_modules\webpack-dev-server\ssl   with the **server.pem**

在chrome设置中->管理证书

导入server.crt可信认证授权重启chrome

package.json

 "scripts": {"start": "set HTTPS=true&&react-scripts start",

我刚刚在Chrome中启用了allow-insecure-localhost标志,仅此而已。

步骤。

  1. 在Chrome选项卡中键入chrome://flags
  2. 搜索allow-insecure-localhost标志并启用它。
  3. 重新启动chrome浏览器。

现在,您将看不到https://localhost站点的不安全警告。

2021年6月-Windows 10-Chromev91(简单)

按照selfsignedcertificate.com中的证书生成说明进行操作:

示例域名:mydomain.local,将其替换为您的域名。

  1. 生成密钥:

    openssl genrsa -out mydomain.local.key 2048
  2. 仅使用以下内容创建配置文件mydomain.local.conf

    [req]distinguished_name=req[SAN]subjectAltName=DNS:mydomain.local

    注意:在subcjectAltName中,您可以定义更多域(可选),例如:

    subjectAltName=DNS:mydomain.local, DNS:*.mydomain.local, DNS:otherdomain.local, IP:192.168.1.10

  3. 创建证书:

    openssl req -new -x509 -key mydomain.local.key -out mydomain.local.crt -days 3650 -subj /CN=mydomain.local -extensions SAN -config mydomain.local.conf
  4. 将证书添加到受信任的根证书颁发机构

    • 右键单击mydomain.local.crt文件
    • 从上下文菜单中选择Install Certificate
    • 在弹出窗口中选择Local Machine
    • 选择Place all certificates in the following store
    • 单击Browse
    • 选择Trusted Root Certification Authorities
    • 点击好的下一个完成
    • 重新启动Chrome。

好的,假设您创建了一个“有效”的自签名证书。它在chrome ver 94上安装正确。但是当您访问该站点时,您不会收到ssl锁并收到“无效证书颁发机构”错误。事实上,这是一个有效的证书。但是如果您没有正确浏览该站点,您将收到此错误。我的证书的DNS是DNS1:TFDM,DNS2:TFDM.local,DNS3:172.31.42.251,DNS4:192.168.20.50。

我正在浏览192.168.20.50,它不安全(锁)。问题是,证书是DNS1: TFDM。所以我不得不输入我的 /etc/hosts文件(centos7)192.168.20.50TFDM进行解析-然后浏览https://TFDM。问题解决。您必须正确浏览网站。我以为它会在服务器端解决,但它必须在客户端解决。这很容易被忽视,如果其他一切都正确,这可能是您的问题。覆盖安全性和ssl功能是自找麻烦,我不认为一个合适的解决方案。如果应用正确,自签名证书可以工作,并遵循Chrome不断变化的规则。

Windows:生成和自签名证书

这是一个在Windows上生成根证书和实际域证书的“单文件”示例。编辑前四个变量,不需要CMD的进一步输入:

SET ROOT=my-rootSET NAME=demodomainSET SUBJECT=/C=CH/O=My Demo CompanySET PASSWORD=ptGXHr3sudczSL9Q
:: Generate private keyopenssl genrsa -des3 -out %ROOT%.key -passout pass:"%PASSWORD%" 2048:: Generate root certificateopenssl req -x509 -new -nodes -key %ROOT%.key -sha256 -days 3650 -out %ROOT%.crt -passin pass:"%PASSWORD%" -subj "%SUBJECT%"

openssl genrsa -out %NAME%.key 2048openssl req -new -key %NAME%.key -subj "%SUBJECT%/CN=%NAME%" -out %NAME%.csr
(echo authorityKeyIdentifier=keyid,issuerecho basicConstraints=CA:FALSEecho keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentecho subjectAltName = @alt_namesecho [alt_names]echo DNS = %NAME%)>config.ext
openssl x509 -req -in %NAME%.csr -CA "%ROOT%.crt" -CAkey "%ROOT%.key" -CAcreateserial -out %NAME%.crt -days 1780 -sha256 -extfile config.ext -passin pass:"%PASSWORD%"
:: cleanup files used for certificate generationdel %NAME%.csrdel config.ext

如果您想在一个文件中拥有完整的链,请将以下内容添加到您的bat文件中:

:: build chain in certificate-fileecho %ROOT%.crt >> %NAME%.crtType "%ROOT%.crt" >> %NAME%.crt

如果要验证证书,请附加以下内容:

openssl verify -CAfile "%ROOT%.crt" -verify_hostname %NAME% %NAME%.crt

打开您的根证书my-root.crt并将其添加到Windows证书存储
(选择受信任的根证书颁发机构):

输入图片描述输入图片描述


Chrome最终结果:

输入图片描述

对于使用NX的Angular Micro前端的mac

步骤1:创建自签名根证书

openssl req -x509 -nodes -new -sha256 -days 390 -newkey rsa:2048 -keyout "RootCA.key" -out "RootCA.pem" -subj "/C=de/CN=localhost.local"openssl x509 -outform pem -in "RootCA.pem" -out "RootCA.crt"

第2步:定义应包含在证书中的域和子域

为此,只需创建一个名为vhosts_domains.ext的文本文件并插入以下内容:

authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentsubjectAltName = @alt_names[alt_names]DNS.1 = localhostDNS.2 = *.mixable.blog.localDNS.3 = mixable.blog.local

此示例包括域mixable.blog.local的本地开发环境的子域和所有子域,如www.mixable.blog.local或apps.mixable.blog.local.

第3步:创建证书

openssl req -new -nodes -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/C=de/ST=State/L=City/O=Organization/CN=localhost.local"openssl x509 -req -sha256 -days 1024 -in localhost.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -extfile vhosts_domains.ext -out localhost.crt

第4步:使证书可用于Angular应用程序

nx serve host --open --devRemotes=<app names> --ssl --ssl-key <folder_location>/localhost.key --ssl-cert <folder_location>/localhost.crt

第5步:从导入将证书添加到macOS钥匙串

输入图片描述

在chrome上,如果您仍然获得无效证书,请下载证书并添加到钥匙串并使所有证书都受信任。