2 回答

TA貢獻1847條經驗 獲得超7個贊
答案取決于您要對證書做什么。
PersistKeySet 行為
如果您想將其添加到X509Store它將“永遠”保持的位置(因此您將其作為帶有PersistKeySet標志的 PFX 導入),那么自我發現的解決方案是正確的:
using (RSA rsa = new RSACryptoServiceProvider(4096, new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", Guid.NewGuid().ToString())))
{
CertificateRequest req = ...;
return req.CreateSelfSigned(...);
}
最重要的是,密鑰被賦予了名稱 ( Guid.NewGuid().ToString()),使其成為持久密鑰。這允許對cert.CopyWithPrivateKey埋在里面的調用CreateSelfSigned附加到磁盤上的鍵上。
EphemeralKeySet 行為,具有受控的 PFX 導出
如果您對該方法的唯一調用是將其導出到 PFX,那么您希望做的事情略有不同。
using (RSACryptoServiceProvider rsa = <same as above>)
{
// Delete this key on Dispose / finalization.
rsa.PersistKeyInCsp = false;
CertificateRequest req = ...;
using (X509Certificate2 cert = req.CreateSelfSigned(...))
{
// At this line the persisted key still exists so it reports its name and CSP/KSP into the PFX.
return cert.Export(X509ContentType.Pkcs12, password);
}
}
再次,密鑰被命名,使 CSP 和名稱保留在 PFX/PKCS12 中。但是該對象被標記為自刪除,因此它會自行清理。
如果您當時返回證書而不是導出,則證書將不再能夠使用其私鑰,并且以后的 PFX 導出將失敗。
“PerphemeralKeySet”行為證書
如果您想暫時使用證書,并控制 PFX 導出,并且密鑰不會永遠存在...結合前兩件事。
using (RSACryptoServiceProvider rsa = ...)
{
rsa.PersistKeyInCsp = false;
CertificateRequest req = ...;
using (X509Certificate2 cert = req.CreateSelfSigned(...))
{
// Export the PFX using the current key. Re-import it with no flags to
// make it a normal "perphemeral" key behavior.
return new X509Certificate2(cert.Export(X509ContentType.Pkcs12), "", X509KeyStorageFlags.Exportable);
}
}
此處的 PFX 導入,因為它發生在原始密鑰被釋放/刪除之前,它會移動到基于 GUID 的新密鑰名稱。如果您關心使用相同的名稱,請byte[]在讓 Dispose 調用密鑰對象之前導出到 a,然后重新導入,并且將使用相同的密鑰名稱(在所有當前版本的 Windows 上)......但現在刪除語義與證書的生命周期而不是 RSA 對象的生命周期相關聯。

TA貢獻1806條經驗 獲得超5個贊
以下代碼似乎確實有效,并且我確認它可以與 Service Fabric 一起使用。
private X509Certificate2 buildSelfSignedServerCertificate(string CertificateName,string password,string dns)
{
SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddIpAddress(IPAddress.Loopback);
sanBuilder.AddIpAddress(IPAddress.IPv6Loopback);
if (!string.IsNullOrEmpty(dns))
{
sanBuilder.AddDnsName(dns);
}
//
// sanBuilder.AddDnsName(Environment.MachineName);
X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN={CertificateName}");
using (RSA rsa = new RSACryptoServiceProvider(2048 * 2, new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", Guid.NewGuid().ToString())))
{
var request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
//request.CertificateExtensions.Add(
// new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));
//request.CertificateExtensions.Add(
// new X509EnhancedKeyUsageExtension(
// new OidCollection { new Oid("1.3.6.1.5.5.7.3.1"), new Oid("1.3.6.1.5.5.7.3.2") }, false));
request.CertificateExtensions.Add(sanBuilder.Build());
var certificate = request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(3650)));
bool isWindows = System.Runtime.InteropServices.RuntimeInformation
.IsOSPlatform(OSPlatform.Windows);
if(isWindows)
certificate.FriendlyName = CertificateName;
return certificate;
// return new X509Certificate2(certificate.Export(X509ContentType.Pfx, password), password, X509KeyStorageFlags.MachineKeySet);
}
}
生成以下證書
================ Certificate 2 ================
X509 Certificate:
Version: 3
Serial Number: 5f35de2753dd8527
Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Algorithm Parameters:
05 00
Issuer:
CN=CN=Test
Name Hash(sha1): 6ef7a8d0891b98b0093b19c9421fdb9e5b344b99
Name Hash(md5): 252ddd96b0338b433e7d73b2697a63c7
NotBefore: 3/12/2019 1:49 PM
NotAfter: 3/10/2029 1:49 PM
Subject:
CN=CN=Test
Name Hash(sha1): 6ef7a8d0891b98b0093b19c9421fdb9e5b344b99
Name Hash(md5): 252ddd96b0338b433e7d73b2697a63c7
Public Key Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA (RSA_SIGN)
Algorithm Parameters:
05 00
Public Key Length: 4096 bits
Public Key: UnusedBits = 0
0000 30 82 02 0a 02 82 02 01 00 ad 51 42 bd 46 df d1
0010 af 96 8e 13 3d 1c 52 34 95 d3 dd be 4f eb 9e ac
0020 60 54 fb 54 2c 39 c8 43 4d 84 76 60 b7 3a 65 94
0030 d0 bb 52 7e d6 de 7e 86 c2 cc c7 63 6d 95 1b fb
0040 2f 94 97 cb 75 2f eb 7f cc de f8 66 58 3d 59 a5
0050 50 0c a6 86 d6 84 87 ae fb 4f 71 30 20 f3 43 be
0060 78 9e a0 0c 38 e8 63 79 1f 90 e7 28 97 8d 48 9c
0070 86 c7 66 63 83 61 6a 11 58 f6 70 ed 1f ce 68 e5
0080 a0 2a 76 66 28 d9 80 77 3f f5 38 47 fa 7b cf 43
0090 38 8c 46 0e 00 ed 93 30 69 8b c8 22 93 ca eb a1
00a0 0b 52 20 e1 3b 83 15 3f 4d 3b 10 b1 a6 d7 d4 f5
00b0 8f 7f 29 53 ad 9c 14 a6 4e 09 71 05 0d da 4d e6
00c0 d2 52 d4 64 4c 79 9d bf cb bd 27 cd 72 86 84 77
00d0 1d 33 6a b8 93 32 11 a7 3d 8a 33 92 54 d4 ae 9b
00e0 18 15 e1 35 b5 d3 08 cf 63 d1 d7 ab a9 60 2a 59
00f0 d6 1c e4 3c a0 c8 4c 03 07 75 e0 e2 08 23 02 63
0100 ce 53 c8 d4 8c e1 58 2a f4 0a eb 96 3a e1 45 4f
0110 19 34 89 bc 57 c2 37 be ee 86 54 b1 ac a4 44 02
0120 54 66 7d 1a 8c d1 05 45 c5 b8 4b 08 c7 a9 4e 84
0130 a1 8b dc 1f e9 7f 78 c6 77 f4 7d 69 78 3b 81 e1
0140 8b 4c 12 0d ad a5 ea 21 e7 3a 26 f6 3c 18 46 e7
0150 09 f9 35 93 05 84 3b d2 2d e1 d9 2d 40 ee 8b 48
0160 55 5c f5 6b 0f af 6f ef 13 28 65 5d 13 83 df ed
0170 97 23 57 31 07 4e 52 1d 93 49 2e 20 90 0b c9 a4
0180 16 56 b5 74 97 df 6e 16 4a b4 38 c6 25 a2 b8 ad
0190 2f 73 96 5c 58 01 73 14 af 79 c1 a6 a1 d0 21 ae
01a0 ff f2 ec a4 61 28 bc c7 f8 0f de fb e0 4c 33 46
01b0 f4 e2 c5 3f ee a0 c2 f4 cd 78 c0 f1 ce 56 d9 bb
01c0 78 f0 a7 43 ea d7 01 ab c1 aa 9f 06 3a 9e ab f9
01d0 47 ef 1e f1 6f 33 d3 e7 d0 ba 31 1c 92 71 4a 10
01e0 cc f9 76 c6 75 d0 f4 90 e9 3d 2f d6 49 d9 c2 81
01f0 42 e2 1e 32 f5 de 97 11 45 42 a1 ef a0 86 aa 69
0200 a2 8b 7a ea 28 fe 36 ae 61 02 03 01 00 01
Certificate Extensions: 1
2.5.29.17: Flags = 0, Length = 1a
Subject Alternative Name
IP Address=127.0.0.1
IP Address=0000:0000:0000:0000:0000:0000:0000:0001
Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Algorithm Parameters:
05 00
Signature: UnusedBits=0
0000 f8 3a 99 42 b4 05 c1 6c e5 64 fa 07 b0 0f 6d a0
0010 a4 b3 bf cd 9d cf b1 67 57 67 0c 62 b2 6c 6e 59
0020 ab eb ca ae fc d3 ff 08 d4 5a 87 11 f2 24 36 8f
0030 0b 28 50 9a ae 57 ea 6e 0c 75 70 d7 71 b0 b3 2c
0040 d3 d7 2d cb d1 9d c0 f3 d6 bf 56 c1 6e 4e 20 78
0050 2e 8c e1 82 4b 54 db c9 a9 c5 ac 6e 29 f7 ec 0f
0060 df 57 a2 93 80 23 b1 45 ac fb a4 a2 ec a2 b0 eb
0070 53 ef 81 71 5b 68 c3 dc 97 5f 58 4d d1 e5 1e e7
0080 e4 5a 30 2a f5 23 8a 44 10 5d 66 62 47 d4 9c b0
0090 20 98 2b 0d c0 1a 56 94 5c 57 97 53 a8 fb ed 10
00a0 db d3 f9 76 ae ba 55 52 fc 4e d4 a9 1a 56 cf 0b
00b0 59 45 cb 5f 32 72 00 e4 9c 47 45 fb 46 91 8f d2
00c0 9e f4 6a b4 74 22 b1 59 e8 1e 90 46 1f 66 16 32
00d0 7b b2 df f3 d5 14 77 f4 6b 0c d5 09 e8 d5 f0 07
00e0 06 48 97 f5 d4 9a c1 db d1 70 49 66 12 d8 b7 05
00f0 18 d1 3d fa 03 37 85 89 23 6b 90 b1 ce c0 29 f7
0100 dd bd 60 3c 9c e0 d8 4e 28 4f 1c 0a f2 a9 73 69
0110 09 e9 61 87 e2 31 e0 3e bd 36 af 51 4c 2a 01 d1
0120 c1 62 67 0d 89 f2 2e b8 ac 67 eb 65 fb c4 1b 92
0130 b3 e6 7c c6 9a 96 bd a0 e5 aa a3 4e 49 05 ac a9
0140 7c 4b e8 55 98 d2 5b 27 21 45 36 e8 f7 59 31 ef
0150 e8 fc 71 15 0d 1b a9 e7 6b c7 c4 98 39 4d 22 4a
0160 19 72 67 92 7c bf 61 8d aa 2c 41 1f ba ec dc b2
0170 5d df 56 f1 2c 35 80 fa c9 9d de 33 b0 26 2d 00
0180 ba 5e 75 c4 ac 6d 08 d9 6c a0 72 74 37 7d dd 4e
0190 31 83 4d 30 9d 07 79 68 40 38 ed e5 7d b0 2b 58
01a0 c1 64 2d 69 5f 3d 46 ba 7a 75 9b 29 10 1b b3 11
01b0 95 9b f3 2d a2 50 94 d8 36 92 79 57 16 53 8c 07
01c0 e1 3b d5 1c a7 5d bc 91 2d ed 21 3e 1d 4f 2b a0
01d0 b6 6c a0 de 78 e1 eb ee 45 b3 16 ea bc f9 4f 18
01e0 37 c8 a8 62 8d 80 54 c3 99 1e a1 6d cb 5c 0e be
01f0 96 ef ad 6b ee ad 4e b7 4e ae b1 9a 62 27 2e 43
Signature matches Public Key
Root Certificate: Subject matches Issuer
Key Id Hash(rfc-sha1): 109b354c4ebab3e38ea9badfbe1d82026dfa3596
Key Id Hash(sha1): 30becd4cbc82ee17ed3b3339b1e06e59426a47e1
Key Id Hash(bcrypt-sha1): 4f636b55894c3952f2c0b286e14b1c4097a33430
Key Id Hash(bcrypt-sha256): dd688647c0bfacf902ca2641503b47626cba4c068700ff9c0966755e07c34631
Key Id Hash(md5): 7463515ce976eff5b43e4a35dab5e4be
Key Id Hash(sha256): bdadaf178abb608a5be995790a1c13c233d0dd21a9de6b7a6f8c7446b6f68006
Key Id Hash(pin-sha256): v1omdJppKmUlS2HN29QXBMLLvAMjSSSAjl1HnkoaVD0=
Key Id Hash(pin-sha256-hex): bf5a26749a692a65254b61cddbd41704c2cbbc03234924808e5d479e4a1a543d
Cert Hash(md5): 8242f9a9036b0181d4ae3bef505f926f
Cert Hash(sha1): bb0df29ab8ac261dc07512f0c503ccac3b94b685
Cert Hash(sha256): 87274aaef464f71120f9b198ca9b19be4c112d3cc51ab7a148639d1dd9a96f93
Signature Hash: 67b6a0ab301683da7f113d13415acdb02cd3213118eaa995458c39e50b79c228
CERT_MD5_HASH_PROP_ID(4):
8242f9a9036b0181d4ae3bef505f926f
CERT_KEY_IDENTIFIER_PROP_ID(20):
30becd4cbc82ee17ed3b3339b1e06e59426a47e1
CERT_KEY_PROV_INFO_PROP_ID(2):
Key Container = 9de3ab72-be6a-4a5a-85b4-321110eadb5d
Unique container name: 736f334a421c52ddfb83677bfcefa723_dbb26849-7c5e-48f1-871d-8a3e25ef9376
Provider = Microsoft Enhanced RSA and AES Cryptographic Provider
ProviderType = 18
Flags = 20 (32)
CRYPT_MACHINE_KEYSET -- 20 (32)
KeySpec = 1 -- AT_KEYEXCHANGE
CERT_SHA1_HASH_PROP_ID(3):
- 2 回答
- 0 關注
- 195 瀏覽
添加回答
舉報