如何运行“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”?的主要内容,如果未能解决你的问题,请参考以下文章