在C#中创建的SQL CLR无法访问本地证书存储区

时间:2015-09-02 16:27:03

标签: c# encryption sql-server-2012 cryptography sqlclr

我无法创建SQL CLR来执行解密功能并从证书存储区加密函数,并从证书中获取结果字符串。

' System.Security.SecurityException:请求类型为'System.Security.Permissions.StorePermission,System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = blahblahblahblah'失败。 System.Security.SecurityException:'

有没有办法让SQL CLR可以访问您可以更改的sys配置或其他信任设置中的证书存储?我是否需要加载依赖的System.Security.Cryptography依赖库?我最终也想在Azure SQL Server上进行设置,这也可能是一个障碍。我知道我的解密和加密在硬编码从模式所需的证书中获得的结果数据时工作正常。但访问证书会更好:

fDecrypt(' mythumbprintstringtofinditlocally',' DLQUOUIEWLKCJLAKJA =!@#$'(某些使用本地证书加密的数据)

而不是对数据进行硬编码。因为此证书可以针对环境进行更改。

private void SetEncryptionDirectlyFromThumbprint(string certThumbprint)
{
    var cert = GetCertificateByThumbprint(certThumbprint, StoreLocation.LocalMachine, StoreName.My);
}

//needs System.Security.Cryptography library.
private X509Certificate2 GetCertificateByThumbprint(string thumbprint, StoreLocation storeLocation, StoreName storeName, bool requirePrivateKey = false)
{
    if (string.IsNullOrEmpty(thumbprint))
    {
        throw new ArgumentNullException("thumbprint");
    }

    var cleanedThumbprint = thumbprint.Replace(" ", "").ToUpperInvariant();

    var store = new X509Store(storeName, storeLocation);

    try
    {
        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);

        var foundCerts = store.Certificates.Find(X509FindType.FindByThumbprint, cleanedThumbprint, false);
        foreach (var cert in foundCerts)
        {
            if (!requirePrivateKey || cert.HasPrivateKey)
            {
                return cert;
            }
        }
    }
    finally
    {
        store.Close();
    }

    return null;
}

1 个答案:

答案 0 :(得分:0)

看起来到目前为止,所有这一切都是“权限”级别'在项目> SQLCLR>权限级别下设置。我将其更改为' External_Access'瞧,它立即起作用了。现在问题似乎是Azure只喜欢安全的程序集,而且最近才包含了使用CLR的能力。 Arghhh,我猜不能赢得他们。