如何从 SQL Server 获取证书公钥?

Posted

技术标签:

【中文标题】如何从 SQL Server 获取证书公钥?【英文标题】:How can I get certificate public key from SQL Server? 【发布时间】:2012-12-22 08:55:13 【问题描述】:

我已将证书导入 SQL Server 数据库。

 create certificate MyCertificate from file = 'c:\certificate.cer';

现在我想检索该证书的公钥。怎么办?

我可以的

select * from sys.certificates

但没有公钥列。

我知道我可以通过

将它保存到磁盘
backup certificate MyCertificate to file = 'c:\MyCertificate.cer';

但这不是我想要的。我只需要数据库告诉我公钥或以某种方式让我获得整个证书,但我不想使用文件。

编辑:

我想使用 SQL Server 和证书验证数据库表中一行的数字签名。但是由于函数 VerifySignedByCert 不检查证书到期日期(根据此说明:用于加密和签名的内置函数不检查证书的到期日期。这些函数的用户必须决定何时检查证书过期。 在http://msdn.microsoft.com/en-US/library/ms187798%28v=SQL.90%29.aspx)我必须在 C# 代码中手动完成。

这就是为什么我想获取证书公钥和到期日期(可以在 sys.certificates 中找到)。但似乎将证书存储在表的 varbinary 列中是最好的选择。还是有其他更好的方法来实现这一点?

感谢您的帮助

【问题讨论】:

mssqltips.com/sqlservertip/2388/… 【参考方案1】:

您要查找的信息位于 syscerts 表中的 master 数据库中。但是,没有简单的方法可以获取这些数据。如果您尝试获取密钥,也许您并没有尝试将证书用于 SQL Server 打算使用证书的目的?

如果您尝试将证书存储在 SQL Server 中,但不将它们用于 SQL Server 的安全性,那么您可能希望尝试将它们存储在表的 varbinary 列中。这样的东西对你有用吗?

如果你能提供更多关于你想要完成的事情的信息,我可能会为你提供更多帮助。

下面是 SQL Server 中证书的一个很好的概述:http://www.mssqltips.com/sqlservertip/1319/sql-server-2005-encryption-certificates-overview/

【讨论】:

感谢您的回答。我已经编辑了问题并添加了更多详细信息。【参考方案2】:

创建一个表 创建表 Atm ( AID int 身份, PIN varchar(300) ) 插入自动取款机(PIN) 值(EncryptByCert(cert_id('PinNumber1'),'473429000000')) 插入自动取款机(PIN) 值(EncryptByCert(cert_id('PinNumber1'),'473567000000')) 插入自动取款机(PIN) 值(EncryptByCert(cert_id('PinNumber1'),'4678904290000'))

然后创建一个证书如下:-

创建证书 PinNumber1 密码加密 ='3e@k80*^' WITH SUBJECT = '此 Pin 号已加密'

如果你想稍后解密它:-

选择转换(varchar(最大值), DecryptByCert(cert_id('PinNumber1'),PIN,N'3e@k80*^')) 从自动取款机 其中 AID=2

【讨论】:

【参考方案3】:

从 SQL Server 2012 开始,有 CERTENCODED(certid) 函数:

SELECT
     *,
     CERTENCODED(C.certificate_id)
FROM sys.certificates C;

根据文档,您可以使用它来重新创建证书,因此它应该是 ASN 编码的证书(没有私钥)。从那里开始,您应该能够找到将证书导入 C# 代码的方法。如果您只对某个证书感兴趣,您也可以使用SELECT CERTENCODED(CERT_ID('myCert')), CERTPROPERTY(CERT_ID('myCert'), 'Expiry_Date') 来获取所需的数据。

【讨论】:

以上是关于如何从 SQL Server 获取证书公钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PEM格式的公钥创建证书对象?

如何从 python 中的 x509 证书中提取公钥?

QSslCertificate 如何获取 Windows 中显示的公钥

如何获取 SSL 固定的公钥哈希?

有人做过wp上如何从pfx文件中获取私钥吗

如何在linux里为ca生成一个私钥