如何运行'dotnet dev-certs https --trust'?

时间:2019-04-03 00:56:58

标签: asp.net ubuntu asp.net-core https

我是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选项。 如何解决这个问题?

5 个答案:

答案 0 :(得分:50)

在Ubuntu上,标准机制为:

  • import serial import sys import _thread class SerialPort: def __init__(self): self.comportName = "" self.baud = 0 self.timeout = None self.ReceiveCallback = None self.isopen = False self.receivedMessage = None self.serialport = serial.Serial() def __del__(self): try: if self.serialport.is_open(): self.serialport.close() except: print("Destructor error closing COM port: ", sys.exc_info()[0] ) def RegisterReceiveCallback(self,aReceiveCallback): self.ReceiveCallback = aReceiveCallback try: _thread.start_new_thread(self.SerialReadlineThread, ()) except: print("Error starting Read thread: ", sys.exc_info()[0]) def SerialReadlineThread(self): while True: try: if self.isopen: self.receivedMessage = self.serialport.readline() if self.receivedMessage != "": self.ReceiveCallback(self.receivedMessage) except: print("Error reading COM port: ", sys.exc_info()[0]) def IsOpen(self): return self.isopen def Open(self,portname,baudrate): if not self.isopen: # serialPort = 'portname', baudrate, bytesize = 8, parity = 'N', stopbits = 1, timeout = None, xonxoff = 0, rtscts = 0) self.serialport.port = portname self.serialport.baudrate = baudrate try: self.serialport.open() self.isopen = True except: print("Error opening COM port: ", sys.exc_info()[0]) def Close(self): if self.isopen: try: self.serialport.close() self.isopen = False except: print("Close error closing COM port: ", sys.exc_info()[0]) def Send(self,message): if self.isopen: try: # Ensure that the end of the message has both \r and \n, not just one or the other newmessage = message.strip() newmessage += '\r\n' self.serialport.write(newmessage.encode('utf-8')) except: print("Error sending message: ", sys.exc_info()[0] ) else: return True else: return False 生成自签名证书
  • 使用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验证它是否受信任

不幸的是,这不起作用:

dotnet dev-certs https
  • 由于无法让dotnet客户端信任证书

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

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

详细信息:

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

    • 创建具有以下内容的localhost.conf文件:
$ openssl verify localhost.crt
CN = localhost
error 20 at 0 depth lookup: unable to get local issuer certificate
error localhost.crt: verification failed
  • 使用[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将证书转换为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
  1. 信任此证书:

    • 将localhost.crt复制到CN = localhost error 18 at 0 depth lookup: self signed certificate error localhost.crt: verification failed
    • 使用/usr/local/share/ca-certificates信任证书
    • 验证证书是否已复制到sudo update-ca-certificates(扩展名更改)
    • 在不使用CAfile选项的情况下验证证书现在应该可以使用
/etc/ssl/certs/localhost.pem
  1. 强制您的应用程序使用此证书

    • 使用以下设置更新您的appsettings.json:
$ openssl verify localhost.crt 
localhost.crt: OK

答案 1 :(得分:4)

除了 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: error:2006D002:BIO 例程:BIO_new_file:系统库

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

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

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

如果在站点的apache日志中出现以下错误:

<块引用>

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

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

SSLProxyEngine on
  1. 之后,如果一切正常,如果您使用的是 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()

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

SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

答案 2 :(得分:0)

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

基于这样的ASP.Net Core application service only listening to Port 5000 on Ubuntu帖子,Linux用户似乎可以解决这个问题。

答案 3 :(得分:0)

对于Chrome:

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

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

重新启动Chrome。

答案 4 :(得分:0)

虽然@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所述。不幸的是,当您以快照方式安装应用程序时,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

中找到有关脚本的更多信息。