我收到一个字符串,并希望使用 C# 将其转换为证书。我尝试了以下代码并收到“ The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.”错误:
byte[] bytes = Convert.FromBase64String(((string[])request.Headers.GetValues("MY-Cert"))[0]);
var cert = new X509Certificate2(bytes);
Run Code Online (Sandbox Code Playgroud)
使用 C# 读取此类字符串的最佳方法是什么?
类似的问题在这里被问到,但是使用 C++
我收到以下格式的字符串:
-----BEGIN CERTIFICATE-----
MIIExDCCA6ygAwIBAgIJAK0JmDc/YXWsMA0GCSqGSIb3DQEBBQUAMIGcMQswCQYD
VQQGEwJJTjELMAkGA1UECBMCQVAxDDAKBgNVBAcTA0hZRDEZMBcGA1UEChMQUm9j
a3dlbGwgY29sbGluczEcMBoGA1UECxMTSW5kaWEgRGVzaWduIENlbnRlcjEOMAwG
A1UEAxMFSU1BQ1MxKTAnBgkqhkiG9w0BCQEWGmJyYWphbkBSb2Nrd2VsbGNvbGxp
bnMuY29tMB4XDTExMDYxNjE0MTQyM1oXDTEyMDYxNTE0MTQyM1owgZwxCzAJBgNV
BAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQKExBSb2Nr
d2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVyMQ4wDAYD
VQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxsY29sbGlu
cy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfjHgUAsbXQFkF
hqv8OTHSzuj+8SKGh49wth3UcH9Nk/YOug7ZvI+tnOcrCZdeG2Ot8Y19Wusf59Y7
q61jSbDWt+7u7P0ylWWcQfCE9IHSiJIaKAklMu2qGB8bFSPqDyVJuWSwcSXEb9C2
xJsabfgJr6mpfWjCOKd58wFprf0RF58pWHyBqBOiZ2U20PKhq8gPJo/pEpcnXTY0
x8bw8LZ3SrrIQZ5WntFKdB7McFKG9yFfEhUamTKOffQ2Y+SDEGVDj3eshF6+Fxgj
8plyg3tZPRLSHh5DR42HTc/35LA52BvjRMWYzrs4nf67gf652pgHh0tFMNMTMgZD
rpTkyts9AgMBAAGjggEFMIIBATAdBgNVHQ4EFgQUG0cLBjouoJPM8dQzKUQCZYNY
y8AwgdEGA1UdIwSByTCBxoAUG0cLBjouoJPM8dQzKUQCZYNYy8ChgaKkgZ8wgZwx
CzAJBgNVBAYTAklOMQswCQYDVQQIEwJBUDEMMAoGA1UEBxMDSFlEMRkwFwYDVQQK
ExBSb2Nrd2VsbCBjb2xsaW5zMRwwGgYDVQQLExNJbmRpYSBEZXNpZ24gQ2VudGVy
MQ4wDAYDVQQDEwVJTUFDUzEpMCcGCSqGSIb3DQEJARYaYnJhamFuQFJvY2t3ZWxs
Y29sbGlucy5jb22CCQCtCZg3P2F1rDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB
BQUAA4IBAQCyYZxEzn7203no9TdhtKDWOFRwzYvY2kZppQ/EpzF+pzh8LdBOebr+
DLRXNh2NIFaEVV0brpQTI4eh6b5j7QyF2UmA6+44zmku9LzS9DQVKGLhIleB436K
ARoWRqxlEK7TF3TauQfaalGH88ZWoDjqqEP/5oWeQ6pr/RChkCHkBSgq6FfGGSLd
ktgFcF0S9U7Ybii/MD+tWMImK8EE3GGgs876yqX/DDhyfW8DfnNZyl35VF/80j/s
0Lj3F7Po1zsaRbQlhOK5rzRVQA2qnsa4IcQBuYqBWiB6XojPgu9PpRSL7ure7sj6
gRQT0OIU5vXzsmhjqKoZ+dBlh1FpSOX2
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud) 我希望通过服务帐户获取Google Analytics的数据.当我第一次启动应用程序时,一切正常,我可以访问数据.但是,当我第二次启动应用程序时,出现以下错误:"系统找不到指定的路径".你有个主意吗?我以为它可以锁定.
这是我的源代码:
public static String GetAccessToken(string clientIdEMail, string keyFilePath, String scope)
{
// certificate
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
// header
var header = new { typ = "JWT", alg = "RS256" };
// claimset
var times = GetExpiryAndIssueDate();
var claimset = new
{
iss = clientIdEMail,
scope = scope,
aud = "https://accounts.google.com/o/oauth2/token",
iat = times[0],
exp = times[1],
};
JavaScriptSerializer ser = new JavaScriptSerializer();
// encoded header
var headerSerialized = ser.Serialize(header);
var headerBytes = …Run Code Online (Sandbox Code Playgroud) 我们决定是否应将"localhost"(以及类似"127.0.0.1"之类的地址)添加为证书中的主题备用名称之一.一个好处可能是促进本地测试.但是会有任何缺点吗?
我正在尝试使用以下代码获取受密码保护的pfx文件的指纹:
function Get-CertificateThumbprint {
#
# This will return a certificate thumbprint, null if the file isn't found or throw an exception.
#
param (
[parameter(Mandatory = $true)][string] $CertificatePath,
[parameter(Mandatory = $false)][string] $CertificatePassword
)
try {
if (!(Test-Path $CertificatePath)) {
return $null;
}
if ($CertificatePassword) {
$sSecStrPassword = ConvertTo-SecureString -String $CertificatePassword -Force –AsPlainText
}
$certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$certificateObject.Import($CertificatePath, $sSecStrPassword);
return $certificateObject.Thumbprint
} catch [Exception] {
#
# Catch accounts already added.
throw $_;
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到此错误:
Cannot find an …Run Code Online (Sandbox Code Playgroud) 面对一个非常奇怪的问题X509Certificate2.Verify()为有效证书返回false.也许有些人之前已经遇到过这种奇怪的情况,并且可以对它有所启发.
我正在使用openssl生成客户端证书以进行测试.我创建了一个根CA并根据该根CA生成客户端证书,并将根CA添加到其链中.
我将根CA和客户端证书加载到本地证书存储区,看起来没问题,但是当我从我的NUnit代码加载它来测试X509Certificate2.Verify()时总是返回false.

以下是从商店加载Cert的代码:
X509Store store = new X509Store(StoreName.My);
string thumbprint = "60 d1 38 95 ee 3a 73 1e 7e 0d 70 68 0f 2d d0 69 1e 9a eb 72";
store.Open(OpenFlags.ReadOnly);
var mCert = store.Certificates.Find(
X509FindType.FindByThumbprint,
thumbprint,
true
).OfType<System.Security.Cryptography.X509Certificates.X509Certificate>().FirstOrDefault();
if(mCert != null)
{
var testClientCert = new X509Certificate2(mCert);
}
Run Code Online (Sandbox Code Playgroud)
这是我刚刚生成的客户端证书:(可以从我的本地计算机正确访问CRL URL)
-----BEGIN CERTIFICATE-----
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQUFADBtMR0wGwYDVQQKExRWaXRh
bEhlYWx0aCBTb2Z0d2FyZTElMCMGA1UECxMcVml0YWxIZWFsdGggU29mdHdhcmUg
Um9vdCBDQTElMCMGA1UEAxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQTAe
Fw0xNTAyMjcwODQ2MzNaFw0xNjAyMjcwODQ2MzNaMEUxHTAbBgNVBAoTFFZpdGFs
SGVhbHRoIFNvZnR3YXJlMREwDwYDVQQLEwhQbGF0Zm9ybTERMA8GA1UEAxMIVGVz
dFVzZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOkfyjX0PSnRYrBbCC8u
rw7IiFdAUj6frPKEmt0TLAR/4g+NazKdGjRRqxE9mNwX/2zGhIcucfGDVwPtOtiV
opicQEzGiSQkvAc+473MN5D6j3XtBYblALMeMyEYoh3LnHO4K+6kV6XE4BXV/2lV
mAVgXGkZzaayd40DLvg48vPlAgMBAAGjgcUwgcIwCQYDVR0TBAIwADARBglghkgB
hvhCAQEEBAMCB4AwCwYDVR0PBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMDEG
CWCGSAGG+EIBDQQkFiJPcGVuU1NMIENlcnRpZmljYXRlIGZvciBTU0wgQ2xpZW50
ME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9wbGF0Zm9ybWRhc2hib2FyZC5ubC52
aXRhbGhlYWx0aC5sb2NhbC9wb3J0YWwvY3JsLmNybDANBgkqhkiG9w0BAQUFAAOB
gQBXYSmZaVu6vnyl94SO4qpNOutsUm4p7fQHehljhZ+aRrXE10rivWCt4g0k961E
PDsp4J0DR6uth6et42pBp8v2gFIGSQY/F7NhmOAsOJvM7z0oIBxMLcclIDTygbRp
KjZZpNjvf+YJasbidosiL4VSeRiCZ+HPzvKDb3wNeafoZA==
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
这是我从浏览器访问时下载的CRL文件:
-----BEGIN X509 CRL-----
MIIBMjCBnDANBgkqhkiG9w0BAQUFADBtMR0wGwYDVQQKExRWaXRhbEhlYWx0aCBT
b2Z0d2FyZTElMCMGA1UECxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQTEl
MCMGA1UEAxMcVml0YWxIZWFsdGggU29mdHdhcmUgUm9vdCBDQRcNMTQwODA3MTQz …Run Code Online (Sandbox Code Playgroud) 我们可以使用X509商店加载商店并在本地机器中查找证书,但如何为远程服务器上的证书执行相同操作?
我知道我们可以配置网络帐户以获得远程计算机上的证书的权限,但如何使用此网络帐户来读取证书详细信息?
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection results = store.Certificates.Find(X509FindType.FindBySubjectName, "CertName", false);
Run Code Online (Sandbox Code Playgroud) 所以下面你会发现我的代码创建了一个带有私钥的自签名证书.它存储在用户存储中.现在,当我使用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) 我想X509Certificate2从字符串创建.让我举个例子:
string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));
Run Code Online (Sandbox Code Playgroud)
并keyBase64String有这样的内容:"MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="
并且file.PKCS7是我从数据库下载的字节数组.
创建时我遇到以下异常X509Certificate2:
找不到请求的对象
并且堆栈跟踪:
"无法在系统中的System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte [] rawData)处的System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32hr)中找不到请求的对象"X509Certificate2异常"无法找到请求的对象"}. WebApp.SoupController.d__7.MoveNext()上的System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData)中的Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData,Object password,X509KeyStorageFlags keyStorageFlags)在D:\ Projects\WebApp\Controllers\SoupController.cs中:第118行
请告诉我我做错了什么.任何帮助将不胜感激!
今天,一位同事遇到了另外一个与这些相关的错误!我发现这些标志在过去我自己真的很令人沮丧,因为如果你在实例化X509Certificate2对象或导出它们或将它们保存在X509Store中时会略微出错,你可能会遇到各种各样奇怪的错误,例如:
是的,它们是有记录的,而且所有文档(以及一些文档似乎都有意义),但为什么它必须这么复杂?
我遇到以下问题:我构建了一个应作为 Azure Web 服务运行的 Web 服务,它调用外部 API 检索一些数据。对于连接,外部公司向我提供了一个证书,我已成功将其存储在 Azure Keyvault 中。经过一番尝试和错误后,我在本地测试了下面的代码块,成功验证了证书是否已从保管库中成功检索。这导致我想要检索的数据得到成功响应。到目前为止一切顺利 - 直到我将其发布到 Azure。一切似乎工作正常,但是我收到以下错误消息:
从传输流接收到意外的 EOF 或 0 字节
我已经用完谷歌的前5页了。我不断寻找有关 TLS 的答案,但在测试选项时我明确将其设置为正确的版本(即使在这个代码片段中,我实际上也只使用 TLS 1.2 就很好)。
这是什么原因造成的?我是否缺少一些神秘的 Azure 配置设置?正如我所说,该代码在我的计算机上 100% 运行。问题似乎不是钥匙或金库。最大的区别是,我在本地以租户管理员身份运行代码,但是我为应用程序服务提供了托管身份,并具有对 keyvault 的正确权限。
我还将提供堆栈跟踪。var 结果 = 等待 client.GetAsync(url);
错误抛出于
var result = await client.GetAsync(url);
Run Code Online (Sandbox Code Playgroud)
我希望我已经提供了足够的信息。先感谢您
代码片段:
public async Task<string>GetData(string url) {
try {
var client = await GetHttpClient();
var result = await client.GetAsync(url);
if (result.IsSuccessStatusCode) {
var content = await result.Content.ReadAsStringAsync();
return content;
} else {
Exception ex = new Exception("Failed …Run Code Online (Sandbox Code Playgroud) x509certificate2 ×10
c# ×6
.net ×2
asp.net ×1
azure ×1
c#-4.0 ×1
certificate ×1
encryption ×1
google-api ×1
oauth-2.0 ×1
openssl ×1
passwords ×1
powershell ×1
tls1.2 ×1
windows ×1