Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 签名凭据-使用私钥的X509证书-SAML2_C#_X509_Saml 2.0_Pfx_Makecert - Fatal编程技术网

C# 签名凭据-使用私钥的X509证书-SAML2

C# 签名凭据-使用私钥的X509证书-SAML2,c#,x509,saml-2.0,pfx,makecert,C#,X509,Saml 2.0,Pfx,Makecert,我对证书几乎一无所知,因为有CA、public和private key,我边学边用。我正在使用saml2创建一个SSO登录,除了添加元素外,我还使用了它 创建证书: 我在一个目录中有一份makecert.exe和pvk2pfx.exe。我打开cmd并键入以下内容: makecert -r -pe -n "CN=Test Cert" -sky exchange -sv testcert.pvk testcert.cer 弹出一个对话框,询问我输入的密码和确认密码。另一个对话框弹出询问密码(我假设

我对证书几乎一无所知,因为有
CA
public
private key
,我边学边用。我正在使用
saml2
创建一个SSO登录,除了添加
元素外,我还使用了它

创建证书:

我在一个目录中有一份
makecert.exe
pvk2pfx.exe
。我打开
cmd
并键入以下内容:

makecert -r -pe -n "CN=Test Cert" -sky exchange -sv testcert.pvk testcert.cer
弹出一个对话框,询问我输入的密码和确认密码。另一个对话框弹出询问密码(我假设这是我之前输入的密码,我一直在做)。这将在同一目录中创建一个
testcert.cer

然后我将其键入
cmd

pvk2pfx -pvk testcert.pvk -spc testcert.cer -pfx testcert.pfx
编辑:它要求我输入密码。我输入了创建
cer
时使用的相同密码(
私钥)

它在目录中创建一个
pfx
文件


这就是我困惑的地方。如果我将
cer
文件导入
MMC
,我可以访问它:

        X509Certificate2 cert = null;

        var store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);

        var storeCollection = store.Certificates.Find(X509FindType.FindBySubjectName, "Test Cert", false);
        if (storeCollection.Count == 1)
        {
            cert = storeCollection[0];
        }

        if (cert == null)
        {
            throw new ArgumentNullException("Certificate", "No certificate found.");
        }

        store.Close();
但是,当我这样做时,私钥(属性)是
null
。我读到私钥在
pfx
文件中。因此,我不访问存储,而是执行以下操作:

privateKey
是我使用
makecert.exe创建证书时使用的私钥

X509SigningCredentials clientSigningCredentials = new X509SigningCredentials(
     X509Certificate2(@"c:\directory\testcert.pfx", privateKey, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable));
我收到一个错误:
指定的网络密码不正确。

我还尝试将
pfx
文件导入
MMC
,而不是
cer
文件。它要求我输入密码。我使用
makecert.exe
创建证书时使用的密码。它总是告诉我密码不正确


我做错了什么?

我认为
makecert
pvk2pfx
在某种程度上是不正确的。我知道这不是答案,但我发现了这个漂亮的小工具:

基本上做了相同的事情,但当我查看证书时,它有:

您有一个与此证书对应的私钥

另一个
testcert.cer
没有这个

现在是代码

X509SigningCredentials clientSigningCredentials = new X509SigningCredentials(
 X509Certificate2(@"c:\directory\testcert.pfx", privateKey, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable));

返回时没有问题,我的SAML断言很好执行。

您需要加载pfx,而不是cer。证书只有公钥。PFX是证书和私钥的包。您应该知道makecert.exe已被弃用,不再受支持。@pm100-好,但为什么当我尝试导入到
MMC
和/或使用
X509SigningCredientals
加载时,
私钥总是不正确?因为PFX有密码,你必须在阅读时提供密码。文件上说你必须提供pvk2pfx的密码,但你没有在question@pm100-对不起-忘了。我提供了与创建
cer
文件时相同的
私钥
密码。