从证书存储区加载时未加载私钥
Private key is not loading upon loading from the Certificate Store
RavenDB 4 的身份验证需要通过我通过 Let's Encrypt 创建的证书进行。我的 私钥证书 (.pfx) 存储在 Azure Key Vault 中。因为只能上传受密码保护的证书,所以我通过密码确保了安全。
通过使用 证书指纹 加载证书后,它始终显示它没有私钥,因此我的 RavenDB 实例的身份验证过程失败。本地通过 Windows 证书存储和 Azure。
我已经尝试过使用私钥证书而不需要密码,然后我能够收到私钥。然而,这不是解决方案,因为我无法将其上传到 Azure。
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2 targetClientCertificate;
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, ravenDbSettings["CertificateThumbPrint"], false);
targetClientCertificate = new X509Certificate2(certCollection[0].GetRawCertData(), ravenDbSettings["CertificatePassword"], X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); ;
我也尝试过使用我在某处找到的导出
var targetTwo = new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, ravenDbSettings["CertificatePassword"]));
但后来我得到了
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state'
我的目标是加载证书的私钥,从而能够在 RavenDB 上进行身份验证。
这可能与您创建证书的方式有关。
试试这个:
下载openssl: http://gnuwin32.sourceforge.net/packages/openssl.htm
生成证书和私钥: openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout YourName.key -out YourName.cert
生成pfx文件: openssl pkcs12 -export -inkey YourName.key -in YourName.cert -out YourName.pfx
导入YourName.pfx到商店
您必须使用存储在 certCollection
变量中的现有证书。最后一行(您填写 targetClientCertificate
变量的地方)不是必需的,如果私钥不可导出,则该行将不起作用。如果代码需要 X509Certificate2
class 的现有实例,则它存储在 certCollection
中并将具有关联的私钥 link.
RavenDB 4 的身份验证需要通过我通过 Let's Encrypt 创建的证书进行。我的 私钥证书 (.pfx) 存储在 Azure Key Vault 中。因为只能上传受密码保护的证书,所以我通过密码确保了安全。
通过使用 证书指纹 加载证书后,它始终显示它没有私钥,因此我的 RavenDB 实例的身份验证过程失败。本地通过 Windows 证书存储和 Azure。
我已经尝试过使用私钥证书而不需要密码,然后我能够收到私钥。然而,这不是解决方案,因为我无法将其上传到 Azure。
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2 targetClientCertificate;
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, ravenDbSettings["CertificateThumbPrint"], false);
targetClientCertificate = new X509Certificate2(certCollection[0].GetRawCertData(), ravenDbSettings["CertificatePassword"], X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); ;
我也尝试过使用我在某处找到的导出
var targetTwo = new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, ravenDbSettings["CertificatePassword"]));
但后来我得到了
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state'
我的目标是加载证书的私钥,从而能够在 RavenDB 上进行身份验证。
这可能与您创建证书的方式有关。 试试这个:
下载openssl: http://gnuwin32.sourceforge.net/packages/openssl.htm
生成证书和私钥: openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout YourName.key -out YourName.cert
生成pfx文件: openssl pkcs12 -export -inkey YourName.key -in YourName.cert -out YourName.pfx
导入YourName.pfx到商店
您必须使用存储在 certCollection
变量中的现有证书。最后一行(您填写 targetClientCertificate
变量的地方)不是必需的,如果私钥不可导出,则该行将不起作用。如果代码需要 X509Certificate2
class 的现有实例,则它存储在 certCollection
中并将具有关联的私钥 link.