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

Kob*_*ob4 54 asp.net ubuntu https asp.net-core

我是 ASP.NET 的新手。

环境:

  • Ubuntu 18.04

  • 视觉工作室代码

  • .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
Run Code Online (Sandbox Code Playgroud)

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

$ Specify --help for a list of available options and commands.
Run Code Online (Sandbox Code Playgroud)

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

chr*_*vdb 84

在 Ubuntu 上,标准机制是:

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

不幸的是,这不起作用:

$ openssl verify localhost.crt
CN = localhost
error 20 at 0 depth lookup: unable to get local issuer certificate
error localhost.crt: verification failed
Run Code Online (Sandbox Code Playgroud)
  • 由于不可能让 dotnet 客户端信任证书

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

  1. 手动生成自签名证书
  2. 相信这个证书
  3. 强制您的应用程序使用此证书

详细:

  1. 手动生成自签名证书:

    • 使用以下内容创建 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
Run Code Online (Sandbox Code Playgroud)
  • 使用生成证书 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -config localhost.conf
  • 使用将证书转换为 pfx openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.crt
  • (可选)验证证书使用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
Run Code Online (Sandbox Code Playgroud)
  1. 相信这个证书:

    • 将 localhost.crt 复制到 /usr/local/share/ca-certificates
    • 信任证书使用 sudo update-ca-certificates
    • 验证证书是否复制到/etc/ssl/certs/localhost.pem(扩展更改)
    • 验证没有 CAfile 选项的证书现在应该可以工作
$ openssl verify localhost.crt 
localhost.crt: OK
Run Code Online (Sandbox Code Playgroud)
  1. 强制您的应用程序使用此证书

    • 使用以下设置更新您的 appsettings.json:
"Kestrel": {
  "Certificates": {
    "Default": {
      "Path": "localhost.pfx",
      "Password": ""
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常有帮助,谢谢。对我来说唯一需要注意的是,这不适用于 openssl 1.0.1,我必须更新到 1.1.1 才能成功。还值得一提的是这个问题:https://github.com/dotnet/aspnetcore/issues/7246,它详细讨论了这个问题。 (3认同)
  • 谢谢,不知道那个线程......会节省我很多时间! (2认同)
  • 按照我得到的步骤: ▶ ls -la /etc/ssl/certs/localhost.pem | grep localhost lrwxrwxrwx 1 root root 46 Oct 18 04:19 /etc/ssl/certs/localhost.pem -&gt; /usr/local/share/ca-certificates/localhost.crt Repositories/dotnet/TodoApi ▶ openssl 验证 localhost.crt CN = ubuntu-machine错误18在0深度查找:自签名证书错误localhost.crt: (2认同)

Bor*_*lms 9

虽然@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


Joh*_*ffy 5

对于 Chrome:

  1. 单击地址栏中的“不安全”。
  2. 单击证书。
  3. 单击详细信息。
  4. 单击导出。

跑步:certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n {FILE_NAME} -i {FILE_NAME}

重新启动 Chrome。


Lea*_*dro 5

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

  1. 您可以在任何文件夹中制作您的证书,可以在或不能在应用程序的同一文件夹中。
  2. 采取openssl verify -CAfile localhost.crt localhost.crt非可选步骤,强制执行。我会帮你的。
  3. 在执行此操作的同时,请勿重新编译或触摸代码,以使第一个场景清晰。
  4. 在某些发行版中,作为用于 Raspberry Pi 的 Raspbian,CA 证书位于/etc/ssl/certs以及/usr/share/ca-certificates/在某些情况下/usr/local/share/certificates
  5. 不要手动将证书复制到受信任的证书,运行 sudo update-ca-certificates
  6. 如果在制作证书时使用密码,则应在 appsettings.json
  7. 如果您收到此错误:

Interop+Crypto+OpenSslCryptographicException:错误:2006D002:BIO 例程:BIO_new_file:系统库

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

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

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

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

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

您必须在 VirtualHost 之后SSLEngine On和之前设置以下配置ProxyPass

SSLProxyEngine on
Run Code Online (Sandbox Code Playgroud)
  1. 之后,如果一切正常,如果您使用的是 Apache 或 Apache2,您可能会看到 500 错误。

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

[proxy:error] [client xxxx:port] AH00898: Error during SSL Handshake with remote server returns by / [proxy_http:error] [client xxxx:port] AH01097: pass request body failed to [::1]:port (localhost ) 来自 xxxx()

您必须在 VirtualHost 之后SSLProxyEngine on和之前设置以下配置ProxyPass

SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
Run Code Online (Sandbox Code Playgroud)


小智 4

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

基于这篇SO文章,Linux用户似乎可以找到一个解决方法:ASP.Net Core application service only Listening to Port 5000 on Ubuntu