我是ASP.NET的新手。
环境:
Ubuntu 18.04
Visual Studio代码
.NET SDK 2.2.105
我在运行某些命令时遇到了麻烦。
我正在
上阅读教程并运行以下命令:
dotnet dev-certs https --trust
我希望https://localhost应该受到信任。 但我发现了错误消息;
$ Specify --help for a list of available options and commands.
似乎“ dotnet dev-certs https”命令没有--trust选项。 如何解决这个问题?
答案 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
验证它是否受信任不幸的是,这不起作用:
openssl verify localhost.crt
生成受https://github.com/openssl/openssl/issues/1418和https://github.com/dotnet/aspnetcore/issues/7246中所述问题影响的证书:dotnet dev-certs https
解决方法:(在Openssl 1.1.1c上测试)
详细信息:
手动生成自签名证书:
$ 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
信任此证书:
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
(扩展名更改)/etc/ssl/certs/localhost.pem
强制您的应用程序使用此证书
$ openssl verify localhost.crt
localhost.crt: OK
答案 1 :(得分:4)
除了 crisvdb 的回答之外,我还有一些信息要添加,并且是 Walktrough 的延续。我不发表评论,因为这是非常复杂的评论,但在此答案之前,请先查看 crisvdb 的答案,然后返回继续。
openssl verify -CAfile localhost.crt localhost.crt
作为非可选步骤,强制。它会有所帮助。/etc/ssl/certs
以及 /usr/share/ca-certificates/
,在某些情况下位于 /usr/local/share/certificates
。sudo update-ca-certificates
appsettings.json
Interop+Crypto+OpenSslCryptographicException: error:2006D002:BIO 例程:BIO_new_file:系统库
考虑到错误意味着“拒绝访问”。可能是因为您没有权限或相关权限。
7b) 也可能是找不到文件,我在配置中使用了整个路径:
"Path": "/home/user/www/myfolder1/myapp/localhost.pfx",
如果在站点的apache日志中出现以下错误:
<块引用>[ssl:error] [remote ::1:yourport] AH01961:SSL 代理请求 yoursite.com:443 但未启用 [提示:SSLProxyEngine] [代理:错误] AH00961:HTTPS:无法为 [::1]:yourport 启用 ssl 支持 (本地主机)
您必须在 VirtualHost 中在 SSLEngine On
之后和 ProxyPass
之前设置以下配置
SSLProxyEngine on
如果在站点的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:
运行: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
中找到有关脚本的更多信息。