如何运行“dotnet dev-certs https --trust”?

Posted

技术标签:

【中文标题】如何运行“dotnet dev-certs https --trust”?【英文标题】:How to run 'dotnet dev-certs https --trust'? 【发布时间】:2019-08-24 09:55:14 【问题描述】:

我是 ASP.NET 的新手。

环境:

Ubuntu 18.04

Visual Studio 代码

.NET SDK 2.2.105

我在运行某些命令时遇到问题。

我正在阅读教程

https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-2.2&tabs=visual-studio-code

并运行以下命令:

dotnet dev-certs https --trust

我希望https://localhost 应该被信任。 但我发现了错误信息;

$ Specify --help for a list of available options and commands.

“dotnet dev-certs https”命令似乎没有 --trust 选项。 如何解决这个问题?

【问题讨论】:

您提供的阅读教程链接似乎指向日语页面。当然是一本很棒的书,但语言障碍可能是个问题。 【参考方案1】:

看起来这是 dotnet 全局工具的一个已知问题,并且该特定命令仅适用于 MacOS 和 Windows。在 github 上查看此问题:Issue 6066。

根据这篇 SO 帖子:ASP.Net Core application service only listening to Port 5000 on Ubuntu,Linux 用户似乎可以解决这个问题。

【讨论】:

【参考方案2】:

对于 Chrome:

    点击地址栏中的“不安全”。 点击证书。 点击详情。 点击导出。

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

重启 Chrome。

【讨论】:

【参考方案3】:

在 Ubuntu 上,标准机制是:

dotnet dev-certs https -v 生成自签名证书 使用 openssl pkcs12 -in <certname>.pfx -nokeys -out localhost.crt -nodes 将 ~/.dotnet/corefx/cryptography/x509stores/my 中生成的证书从 pfx 转换为 pem 将localhost.crt复制到/usr/local/share/ca-certificates 使用sudo update-ca-certificates信任证书 验证是否将证书复制到/etc/ssl/certs/localhost.pem(扩展名更改) 使用openssl verify localhost.crt 验证它是否受信任

很遗憾,这不起作用:

dotnet dev-certs https 生成受https://github.com/openssl/openssl/issues/1418 和https://github.com/dotnet/aspnetcore/issues/7246 中描述的问题影响的证书:
$ openssl verify localhost.crt
CN = localhost
error 20 at 0 depth lookup: unable to get local issuer certificate
error localhost.crt: verification failed
因此,dotnet 客户端无法信任证书

解决方法:(在 Openssl 1.1.1c 上测试)

    手动生成自签名证书 信任此证书 强制您的应用程序使用此证书

详细说明:

    手动生成自签名证书:

    创建 localhost.conf 文件,内容如下:
[req]
default_bits       = 2048
default_keyfile    = localhost.key
distinguished_name = req_distinguished_name
req_extensions     = req_ext
x509_extensions    = v3_ca

[req_distinguished_name]
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_default          = localhost
commonName_max              = 64

[req_ext]
subjectAltName = @alt_names

[v3_ca]
subjectAltName = @alt_names
basicConstraints = critical, CA:false
keyUsage = keyCertSign, cRLSign, digitalSignature,keyEncipherment

[alt_names]
DNS.1   = localhost
DNS.2   = 127.0.0.1
使用openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -config localhost.conf生成证书 使用openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.crt将证书转换为pfx (可选)使用openssl verify -CAfile localhost.crt localhost.crt 验证证书,这应该产生localhost.crt: OK 因为它还不受信任,所以使用 openssl verify localhost.crt 应该会失败
CN = localhost
error 18 at 0 depth lookup: self signed certificate
error localhost.crt: verification failed

    信任此证书:

    复制localhost.crt到/usr/local/share/ca-certificates 使用sudo update-ca-certificates信任证书 验证是否将证书复制到/etc/ssl/certs/localhost.pem(扩展名更改) 现在应该可以在不使用 CAfile 选项的情况下验证证书了
$ openssl verify localhost.crt 
localhost.crt: OK

    强制您的应用程序使用此证书

    使用以下设置更新您的 appsettings.json:
"Kestrel": 
  "Certificates": 
    "Default": 
      "Path": "localhost.pfx",
      "Password": ""
    
  

【讨论】:

非常有帮助,谢谢。对我来说唯一需要注意的是,这不适用于 openssl 1.0.1,我必须更新到 1.1.1 才能成功。另外值得一提的是这个问题:github.com/dotnet/aspnetcore/issues/7246 详细讨论了这个问题。 谢谢,不知道那个线程...会为我节省很多时间! 谢谢。当我在 WSL 上使用 Ubuntu 时,我还在 Windows 证书存储中安装了 .pfx 文件:“受信任的根证书颁发机构”。 按照我得到的步骤: ▶ ls -la /etc/ssl/certs/localhost.pem | grep localhost lrwxrwxrwx 1 root root 46 Oct 18 04:19 /etc/ssl/certs/localhost.pem -> /usr/local/share/ca-certificates/localhost.crt Repositories/dotnet/TodoApi ▶ openssl verify localhost.crt CN = 0 深度查找时的 ubuntu 机器错误 18:自签名证书错误 localhost.crt: @Snewedon 很遗憾听到它不起作用。我遵循完全相同的步骤,它确实对我有用。很难根据可用的有限信息进行调试。也许不同的openssl版本?需要 v1.1.1 或更高版本。【参考方案4】:

虽然@chrsvdb 提供的答案很有帮助,但它并不能解决所有问题。我仍然遇到服务到服务通信的问题(HttpClient - PartialChain 错误),而且您必须重新配置 Kestrel 以使用您自己的证书。可以创建自签名证书并将其导入 .NET SDK。您只需在证书中指定1.3.6.1.4.1.311.84.1.1 扩展名即可。

之后,证书可以导入 .NET Core SDK 并受信任。信任 Linux 有点困难,因为每个应用程序都可以拥有自己的证书存储。例如。 Chromium 和 Edge 使用 nssdb,可以使用 certutil 进行配置,如 John Duffy 所述。不幸的是,当您将应用程序安装为 snap 时,nssdb 的位置可能会有所不同。然后每个应用程序都有自己的数据库。例如。对于 Chromium Snap,路径是 $HOME/snap/chromium/current/.pki/nssdb,对于 Postman Snap,路径是 $HOME/snap/postman/current/.pki/nssdb 等等。

为此,我创建了一个生成证书的脚本,信任它用于 Postman Snap、Chmromium Snap、当前用户 nssdb 和系统级别。它还将脚本导入 .NET SDK,以便 ASP.NET Core 使用它,而无需更改配置。您可以在我的博文https://blog.wille-zone.de/post/aspnetcore-devcert-for-ubuntu中找到有关该脚本的更多信息

【讨论】:

这就是答案!!!很棒的工具,花了整整一个下午试图让一个简单的 blazor 应用程序工作但没有成功。过了这么久,我才发现了这个超级脚本,很棒,很神奇,只用了 10 秒。 该脚本对我来说运行良好,在 Linux Mint 20.2 上运行 .NET 5.0。谢谢。【参考方案5】:

除了 crisvdb 答案之外,我还有一些信息要添加,并且是演练的延续。我不发表评论,因为评论非常复杂,但在此答案之前先查看 crisvdb 答案,然后返回继续。

    您可以在任何文件夹中制作您的证书,可以或不能在应用程序的同一文件夹中。 将openssl verify -CAfile localhost.crt localhost.crt 视为非可选步骤,强制执行。这会有所帮助。 在执行此操作时不要重新编译或触摸代码,以使第一个场景干净。 在某些发行版中,作为 Raspberry Pi 的 Raspbian,CA 证书位于 /etc/ssl/certs 以及 /usr/share/ca-certificates/ 和在某些情况下 /usr/local/share/certificates。 不要将证书手动复制到受信任的证书,运行sudo update-ca-certificates 如果您在制作证书时使用密码,您应该在appsettings.json 中使用它 如果您收到此错误:

互操作+加密+OpenSslCryptographicException:错误:2006D002:BIO 例程:BIO_new_file:系统库

考虑到错误意味着“访问被拒绝”。可能是因为您没有权限或相关权限。

7b) 也可能是找不到文件,我在配置中使用了整个路径:

 "Path": "/home/user/www/myfolder1/myapp/localhost.pfx",
    之后,如果一切正常,如果您使用的是 Apache 或 Apache2,您可能会看到 500 错误。

如果您在站点的 apache 日志中收到以下错误:

[ssl:error] [remote ::1:yourport] AH01961: SSL 代理请求 yoursite.com:443 但未启用 [提示:SSLProxyEngine] [代理:错误] AH00961: HTTPS: 无法为 [::1]:yourport 启用 ssl 支持 (本地主机)

您必须在虚拟主机中在SSLEngine On 之后和ProxyPass 之前设置以下配置

SSLProxyEngine on
    之后,如果一切正常,如果您使用的是 Apache 或 Apache2,您可能会看到 500 错误。

如果您在站点的 apache 日志中收到以下错误:

[proxy:error] [client x.x.x.x:port] AH00898: SSL 期间出错 与 / 返回的远程服务器握手 [proxy_http:error] [client x.x.x.x:port] AH01097:将请求正文传递到 [::1]:port 失败 (本地主机)来自 x.x.x.x()

您必须在虚拟主机中在SSLProxyEngine on 之后和ProxyPass 之前设置以下配置

SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

更新

如果您正在翻新它并使用相同的名称,请注意您应该从 etc/ssl/certs 中删除您的 pem 文件

【讨论】:

以上是关于如何运行“dotnet dev-certs https --trust”?的主要内容,如果未能解决你的问题,请参考以下文章

程序运行原理:程序是如何运行又是如何崩溃的?

程序运行原理:程序是如何运行又是如何崩溃的?

程序运行原理:程序是如何运行又是如何崩溃的?

程序运行原理:程序是如何运行又是如何崩溃的?

汇编程序运行后,如何查看运行结果

如何让VBS文件 自动开机就运行