我目前所做的是使用OpenSSL生成PFX文件.这导致了不必要的依赖,特别是对于Windows用户.所以我找到了一些关于如何使用BouncyCastle创建自己的证书的示例,但是这个库不兼容.NET Core(或者我找不到兼容的包).
那么,是否可以仅使用.NET内核创建自己的自签名X509证书,以避免依赖OpenSSL(或任何其他证书生成外部工具)?
编辑:有人(编辑?)建议这个问题如何使用C#创建自签名证书?提供了答案.遗憾的是,这与.NET Core无关.接受的答案从那开始This implementation uses the CX509CertificateRequestCertificate COM object (and friends - MSDN doc) from certenroll.dll to create a self signed certificate request and sign it,显然不是.NET Core ......实际上,没有一个答案是.NET Core兼容的.
我正在尝试使用纯.net代码来创建证书请求,并根据我可用的现有CA证书(在Windows证书存储区中或作为单独的文件)从证书请求创建证书.
我知道我有类X509Certificate和X509Certificate2可供加载证书并访问他们的信息,但我没有看到中的任何类或功能System.Security.Cryptography,可以用来创建证书请求或签署这样的证书请求创建命名空间新签名证书.
虽然关于System.Security.Cryptography.Pkcs命名空间的文档说:
System.Security.Cryptography.Pkcs命名空间提供公钥加密标准(PKCS)的编程元素,包括签名数据,交换密钥,请求证书,公钥加密和解密以及其他安全功能的方法.
那么,如何创建证书请求并使用纯.net类来签署该请求以创建新的X509证书System.Security.Cryptography?
注意:
我发现了与构建使用C:\ Windows\System32\CertEnroll.dll作为参考的应用程序相关的问题.
在Windows 7上使用VS 2015编译然后在Windows 7计算机上运行时,以下代码可以正常工作.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CERTENROLLLib;
namespace CertTest
{
class Program
{
static void Main(string[] args)
{
try
{
CX509PrivateKey key = new CX509PrivateKey();
key.ContainerName = Guid.NewGuid().ToString();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当您尝试在Windows 10中编译它,然后尝试在Windows 7计算机上运行它时,它会引发以下错误.
"无法将'System .__ ComObject'类型的COM对象强制转换为接口类型'CERTENROLLLib.CX509PrivateKey'.此操作失败,因为QueryInterface调用COM组件上的IID为'{728AB362-217D-11DA-B2A4-000E7BBB2B09}的接口'由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))."
我有几个人在这里复制它,我想在联系微软之前得到更多的意见,了解这里发生了什么.
我想我的问题是:其他人可以证实这一点,或者是否确认他们违反了兼容性?
我有一个自托管的WCF服务器作为本地系统帐户下的Windows服务运行.我正在尝试以编程方式在c#中创建自签名证书,以便使用消息级别安全性与net.tcp端点一起使用.
我使用以下代码,它非常基于如何使用C#创建自签名证书中的接受答案?试图解决我的问题的一些小变化.
public static X509Certificate2 CreateSelfSignedCertificate(string subjectName, TimeSpan expirationLength)
{
// create DN for subject and issuer
var dn = new CX500DistinguishedName();
dn.Encode("CN=" + subjectName, X500NameFlags.XCN_CERT_NAME_STR_NONE);
CX509PrivateKey privateKey = new CX509PrivateKey();
privateKey.ProviderName = "Microsoft Strong Cryptographic Provider";
privateKey.Length = 1024;
privateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE;
privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_DECRYPT_FLAG | X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_KEY_AGREEMENT_FLAG;
privateKey.MachineContext = true;
privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG;
privateKey.Create();
// Use the stronger SHA512 hashing algorithm
var hashobj = new CObjectId();
hashobj.InitializeFromAlgorithmName(ObjectIdGroupId.XCN_CRYPT_HASH_ALG_OID_GROUP_ID,
ObjectIdPublicKeyFlags.XCN_CRYPT_OID_INFO_PUBKEY_ANY,
AlgorithmFlags.AlgorithmFlagsNone, "SHA1");
// Create the self signing …Run Code Online (Sandbox Code Playgroud) 我在使用我创建的证书签署JWT令牌时遇到问题.我理解签名(公钥/私钥)如何工作的基本原理,但是类和工具集非常混乱.我一直在忙着这个示例代码,我已经完全陷入了困境.当我运行附加的示例代码时,我最终得到以下错误(在tokenHandler.CreateToken()通话中):
System.NotSupportedException:'IDX10634:无法创建SignatureProvider.算法:'[PII is hidden]',SecurityKey:'[PII is hidden]'不受支持.
我提供了我在CertificatePfxFileBase64Encoded变量base64编码中创建的证书.它是一个.pfx文件,其中嵌入了私钥,没有密码.它是一个二进制文件,所以我必须base64编码才能在这里分享它.我正在努力弄清楚这些课程是如何运作的,但我无法克服这个障碍.有任何想法吗?下面的示例应该是完全自包含的,您只需要收集引用.
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;
namespace SecurityStuff
{
public class Testing
{
static string CertificatePfxFileBase64Encoded = @"
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
B1gJ8j4mJ7HmXhEABAjfmw/u2zlmsAICCAA=";
public …Run Code Online (Sandbox Code Playgroud) 我有使用 X509Certificate2 创建 jwt 令牌的处理程序。对于单元测试,我需要提供证书,而我无法从本地商店获取证书。有没有办法,如何从文件中模拟、创建或加载证书?
到目前为止,我从这张票中尝试了 BouncingCastle 方法,但没有成功。ToX509Certificate2() 方法确实转换证书,但没有密钥。因此,如果这是好的方法,是否可以以某种方式生成这些密钥?
非常感谢提示
所以下面你会发现我的代码创建了一个带有私钥的自签名证书.它存储在用户存储中.现在,当我使用mmc工具时,我可以从证书中导出私钥吗?我认为这是您在创建证书时必须明确添加的标志?
所以我想知道的是,如何更改此代码,以便私钥不再可以通过mmc导出.
码:
public static X509Certificate2 GenerateSelfSignedCertificateNoCA(string subjectName, string issuerName)
{
const int keyStrength = 2048;
// Generating Random Numbers
CryptoApiRandomGenerator randomGenerator = new CryptoApiRandomGenerator();
SecureRandom random = new SecureRandom(randomGenerator);
// The Certificate Generator
X509V3CertificateGenerator certificateGenerator = new X509V3CertificateGenerator();
// Serial Number
BigInteger serialNumber = BigIntegers.CreateRandomInRange(BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
certificateGenerator.SetSerialNumber(serialNumber);
// Signature Algorithm
const string signatureAlgorithm = "SHA256WithRSA";
certificateGenerator.SetSignatureAlgorithm(signatureAlgorithm);
// Issuer and Subject Name
X509Name subjectDN = new X509Name(subjectName);
X509Name issuerDN = new X509Name(issuerName);
certificateGenerator.SetIssuerDN(issuerDN);
certificateGenerator.SetSubjectDN(subjectDN);
// Valid For
DateTime notBefore …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用特定的加密参数值创建自签名证书.
在运行PowerShell 5.0的Win Server 2012 r2标准上,当我尝试使用时
New-SelfSignedCertificate
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
New-SelfSignedCertificate:找不到与参数名称"Subject"匹配的参数.
当我尝试使用该-Subject参数时,除了我的笔记本电脑上允许的其他参数之外,该参数不会出现在intellisense中.
但是在我的笔记本电脑上(Win 10和PowerShell 5.0),我可以使用这些参数,并使用以下代码创建自签名证书
#create a Certificate
# OID for document encryption
$Oid = New-Object System.Security.Cryptography.Oid "1.3.6.1.4.1.311.80.1"
$oidCollection = New-Object System.Security.Cryptography.OidCollection
$oidCollection.Add($oid) > $Null
# Create enhanced key usage extension that allows document encryption
$Ext = New-Object System.Security.Cryptography.X509Certificates.X509EnhancedKeyUsageExtension $oidCollection, $true
$myCert = New-SelfSignedCertificate -Subject 'CN=myservernameasubject' -CertStoreLocation "Cert:\LocalMachine\My" -KeySpec KeyExchange -KeyUsage KeyEncipherment, DataEncipherment -Extension $Ext
Run Code Online (Sandbox Code Playgroud) 我有一个Windows服务(作为LocalSystem运行),它自我托管OWIN服务(SignalR),需要通过SSL访问.
我可以在我的本地开发机器上设置SSL绑定 - 我可以在同一台机器上通过SSL访问我的服务.但是,当我转到另一台机器并尝试运行以下命令时,我收到一个错误:
命令:
netsh http add sslcert ipport=0.0.0.0:9389 appid={...guid here...} certhash=...cert hash here...
Run Code Online (Sandbox Code Playgroud)
错误:
SSL证书添加失败,错误:1312
指定的登录会话不存在.它可能已被终止.
我使用的证书是完全签名的证书(不是开发证书),可以在我的本地开发箱中使用.这就是我在做的事情:
Windows服务启动并使用以下代码注册我的证书:
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
var path = AppDomain.CurrentDomain.BaseDirectory;
var cert = new X509Certificate2(path + @"\mycert.cer");
var existingCert = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false);
if (existingCert.Count == 0)
store.Add(cert);
store.Close();
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用netsh和以下代码将证书绑定到端口9389:
var process = new Process {
StartInfo = new ProcessStartInfo {
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = "/c netsh http add sslcert ipport=0.0.0.0:9389 appid={12345678-db90-4b66-8b01-88f7af2e36bf} certhash=" + cert.thumbprint …Run Code Online (Sandbox Code Playgroud) 我支持使用 Owin 在 localhost 上托管 HTTP 接口的应用程序。这已经有效多年,但从 Windows 11 开始,绑定证书显示为 ERR_SSL_KEY_USAGE_INCOMPATIBLE。对于 Chrome 和 Edge 来说都是如此。证书没有改变,并且在 Windows 10 上运行良好(测试至 20H2)。
如果我使用 Windows 11 生成新的证书,那么问题就会消失。在比较旧证书和新证书时,我找不到它不起作用的原因。
非工作证书的密钥用法:不可否认性、密钥加密、数据加密、密钥协议 (78) 增强:服务器身份验证 (1.3.6.1.5.5.7.3.1)
工作证书的密钥用法:数字签名、密钥加密 (a0) 增强:客户端身份验证 (1.3.6.1.5.5.7.3.2) 服务器身份验证 (1.3.6.1.5.5.7.3.1)
编辑:
谢谢@Steffen Ullrich!你说的绝对是我需要的动力。但你会说这是我的答案吗?
在 Windows 10 上,使用旧证书,我使用 Chrome 找出:与此站点的连接是使用 TLS 1.2、带有 P-384 的 ECDHE_RSA 和 AES_256_GCM 进行加密和身份验证的。
在 Windows 11 上,使用新证书,我看到: 与此站点的连接已使用 TLS 1.3、X25519 和 AES_256_GCM 进行加密和身份验证。
我已经通过浏览器设置禁用了 TLS 1.3,但显然这不起作用。我使用注册表禁用了 TLS 1.3,现在原始证书可以正常工作了!(与 Win 10 一样使用 TLS 1.2 连接)。
四处探索我发现了这个: https://learn.microsoft.com/en-us/windows/win32/secauthn/tls-cipher-suites-in-windows-11
这表明 TLS …
我正在尝试在 C# 程序集(目标.NET 4.0)中即时(以编程方式)生成自签名证书,以作为根 CA 生成其他证书。该证书不需要保留在 Windows 证书存储中,我会将其导出为文件。
通过阅读这个问题(特别是,@ dthorpe的答案),我决定给一个尝试CLR安全。
该CLR Security库在CngKey 类上放置了一个扩展方法来生成自签名证书,但我无法成功创建CngKeywith的实例:
var key = CngKey.Create(CngAlgorithm.Sha1); //same with Sha256, Sha512 and MD5
//or
var key = CngKey.Create(CngAlgorithm.Sha1, null, new CngKeyCreationParameters()
{
ExportPolicy = CngExportPolicies.AllowExport,
KeyUsage = CngKeyUsages.AllUsages,
KeyCreationOptions = CngKeyCreationOptions.MachineKey,
});
Run Code Online (Sandbox Code Playgroud)
这些行中的任何一行都会引发异常:
System.Security.Cryptography.CryptographicException 未处理
HResult=-2146893783
Message=不支持请求的操作。
Source=System.Core
StackTrace:
at System.Security.Cryptography.NCryptNative.CreatePersistedKey(SafeNCryptProviderHandle provider, String algorithm, String name, CngKeyCreationOptions options)
at System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm, String keyName, CngKeyCreationParameters creationParameters)
at …Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×5
certificate ×3
self-signed ×3
x509 ×2
.net-4.0 ×1
.net-4.5 ×1
.net-core ×1
certenroll ×1
cryptography ×1
jwt ×1
owin ×1
pfx ×1
powershell ×1
self-hosting ×1
ssl ×1
unit-testing ×1
wcf-security ×1
windows-10 ×1