ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-以编程方式将证书添加到个人商店

2019-10-29 12:09:32  阅读:324  来源: 互联网

标签:certificate x509certificate wif wcf c


我正在处理的项目包括一个与WCF Web服务通信的MVC网站,该网站已通过Windows身份验证.我有一个试图以编程方式添加的身份委托证书.要手动执行此操作,请在mmc中打开证书管理单元,将.pfx文件导入到Personal中,然后输入密码.然后,我必须单击“管理私钥”并允许IIS_IUSRS的权限.
为了复制此过程,我想出了以下控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        var cert = new X509Certificate2("location.pfx", "password", X509KeyStorageFlags.MachineKeySet);
        AddCert(StoreName.My, StoreLocation.LocalMachine, cert);
        AddAccessToCertificate(cert, "IIS_IUSRS");
    }

    private static void AddCert(StoreName storeName, StoreLocation storeLocation, X509Certificate2 cert)
    {
        X509Store store = new X509Store(storeName, storeLocation);
        store.Open(OpenFlags.ReadWrite);
        store.Add(cert);
        store.Close();
    }

    private static void AddAccessToCertificate(X509Certificate2 cert, string user)
    {
        RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;

        if (rsa != null)
        {
            string keyfilepath =
                FindKeyLocation(rsa.CspKeyContainerInfo.UniqueKeyContainerName);

            FileInfo file = new FileInfo(keyfilepath + "\\" +
                rsa.CspKeyContainerInfo.UniqueKeyContainerName);

            FileSecurity fs = file.GetAccessControl();

            NTAccount account = new NTAccount(user);
            fs.AddAccessRule(new FileSystemAccessRule(account,
            FileSystemRights.FullControl, AccessControlType.Allow));

            file.SetAccessControl(fs);
        }
    }
    private static string FindKeyLocation(string keyFileName)
    {
        string text1 =
        Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
        string text2 = text1 + @"\Microsoft\Crypto\RSA\MachineKeys";
        string[] textArray1 = Directory.GetFiles(text2, keyFileName);
        if (textArray1.Length > 0)
        {
            return text2;
        }
        string text3 =
        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        string text4 = text3 + @"\Microsoft\Crypto\RSA\";
        textArray1 = Directory.GetDirectories(text4);
        if (textArray1.Length > 0)
        {
            foreach (string text5 in textArray1)
            {
                textArray1 = Directory.GetFiles(text5, keyFileName);
                if (textArray1.Length != 0)
                {
                    return text5;
                }
            }
        }
        return "Private key exists but is not accessible";
    }
}

不幸的是,这给出了错误:

未指定安全令牌发行者的地址.必须在目标“ https://service.svc”的绑定中指定一个明确的发行者地址,或者必须在凭据中配置本地发行者地址.

我认识到我对这些东西有很大的知识鸿沟,因此,我希望获得一些指导!

我的问题是,手动和自动流程有什么区别?

解决方法:

这行:

var cert = new X509Certificate2(“ location.pfx”,“ password”,X509KeyStorageFlags.MachineKeySet);

本来应该

var cert = new X509Certificate2(“ location.pfx”,“ password”,X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);

缺少的是X509KeyStorageFlags.PersistKeySet.

我有一些helpful information on certificates from here.

标签:certificate,x509certificate,wif,wcf,c
来源: https://codeday.me/bug/20191029/1959707.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有