任何人都不知道,在ASP.NET C#中如何从客户端获取X509Certificates证书,并且在IIS服务器上托管的这个应用程序而不是控制台应用程序。
我的参考代码:
private void getSign()
{
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2 cert = null;
//manually chose the certificate in the store
X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
if (sel.Count > 0)
cert = sel[0];
else
{
//MessageBox.Show("Certificate not found");
return;
}
SignWithThisCert(cert);
}
免责声明:虽然,它不是对您的问题的直接回答,但可能包含指导您根据业务需求获得正确的方法。你的问题主要有两个问题。其中一个我试图在评论中讨论,但可能需要解释。
任务:让用户上传一个PDF到web应用程序并使其签名。
要求:必须使用存储在客户端USB令牌上的证书对PDF进行签名。
您建议的解决方案:获取客户端证书(从客户端)并在服务器端执行签名。
签名:文档签名用于保证文档的完整性,确保文档在签名后没有受到任何篡改。数字签名提供有关执行签名的实体的信息。这增加了不可否认特性。签字人一经签字,就不能否认签字事实,并证明文件中的信息在签字时是正确的。非对称签名需要私钥。关联的公钥可用于验证和验证签名。
问题1:一旦私钥离开客户端并复制到web应用程序,您就突破了安全边界。结果,密钥不再是私有的,因为web应用程序拥有私有密钥的知识,并且它被存储(即使是临时的)在服务器内存中。或者,简单地说,密钥被泄露和泄露了。
客户不再负责他的密钥和由该密钥进行的操作。客户端可以拒绝使用其私钥进行的任何操作。并拒绝web应用程序所做的签名。
问题2:您建议的设计假设PDF按原样复制到服务器。只有这样它才会被签署。但是,一旦文档(或者更准确地说,它的精确二进制副本)接触到网络,客户端就不再对文档的准确性负责了。因为文档可能在传输过程中被转换,或者在客户端和文档签名代码之间接触文档的一些代码。
问题3:(不是真正的问题,但值得解释)提供的代码不能执行预期的任务(尽管它看起来在dev环境中工作)。您的目标是在客户端上调用证书选择对话框以选择正确的证书。
在测试期间,您正在本地运行所有代码。在调试器中,web应用程序在当前记录的用户(这是交互式会话)下运行,并且能够显示证书选择对话框。但是,您不能很容易地识别它是在哪个上下文(客户端或服务器)中执行的,因为客户端和服务器都运行在同一台机器上,并在相同的安全上下文下运行。实际上,它是在服务器上下文下调用的。
当您将应用程序部署到web服务器时,您可以看到两者的区别。Web应用程序在某个应用程序池上下文(用户帐户)下运行,并且此会话不是交互式的。因此,X509Certificate2UI
类无法显示该对话框,因为没有人会看到它,也没有人可以按下它上的按钮。无论客户端和服务器运行在相同或不同的计算机上,此行为都是一致的,因为IIS(或其他web服务器)会立即分离关注点和安全边界,而调试器不会。并且客户端和服务器肯定会在不同的安全上下文下运行。即使强制使用相同的上下文,IIS也会生成一个次要的非交互式用户会话来运行web应用程序。
为了在客户端上显示证书选择对话框,您必须与客户端进行深度交互,例如,通过Silverlight(不确定Silverlight中是否有X509Certificate2UI
)或某些ActiveX控件。您必须在客户端运行一些代码来实现这一点。
首选解决方案:我们确定了您的设计中常见的风险:密钥泄漏和服务器上客户端与签名代码之间的文档完整性。为了轻松地减轻这一切,您应该只做一件事:在客户端执行文档签名。这样,签名私钥就不会从客户端泄露,并且在web应用程序签名和接收过程中保证了文档的完整性。
现在,我们可以讨论证书属性。您的要求是使用存储在USB令牌上的证书。我不知道你这里指的是什么代币。Is是带有PFX的标准USB大容量存储器,或者是密码设备(带有USB接口的智能卡,通常指USB令牌。例如阿拉丁(SafeNet)eToken设备)。
如果它是USB大容量存储设备,那么它就不能成为需求的一部分,因为通用USB驱动器不能提供任何有助于识别证书来源的东西。任何证书都可以轻松复制到USB驱动器,任何证书都可以从USB驱动器复制。
如果它是USB智能卡,那么就有一种方法来识别证书是来自这个设备,还是其他来源。智能卡有一个独特的特性:私钥永远不会离开卡。所有操作都在一张卡上执行(这就是为什么它们比存储在PC上的证书慢的原因)。
这通常是通过在证书颁发期间向签名证书添加额外信息来完成的。例如,通过添加证书策略
证书扩展。这将要求CA Operator/Manager确保仅将具有指定证书策略的证书部署到智能卡。
我想使用USB令牌(加密狗)中的用户密钥和证书对文件进行签名。 我已经在stackoverflow和其他网站上搜索了一段时间,但除了中的一些好功能之外,没有得到任何有用的东西。NET framework(我没有使用)。 似乎由于密钥没有暴露,加密是由硬件本身完成的。这是否意味着每个硬件制造商都提供自己的API,并且没有通用方法来解决这个问题? 此外,我还了解到,一旦令牌插入计算机,其证书就会加载到
问题内容: 我想用PyCrypto在python中加密一些数据。 但是使用时出现错误: 密钥是使用以下命令生成的: 代码是: 问题答案: PyCrypto不支持X.509证书。您必须首先使用以下命令提取公钥: 然后,您可以在上使用。 如果您不想或不能使用openssl,则可以获取PEM X.509证书,并使用纯Python进行认证,如下所示:
我正在编写一个用例,试图实现以下目标: > 使用OpenID Connect协议。规范在这里:(http://openid.net/specs/openid-connect-core-1_0.html) 使用以下命令调用/oauth2/access_令牌endpoint: a.对于资源身份验证:使用这是根据规范(https://datatracker.ietf.org/doc/html/draft
我正在测试iText 7.1.2.0库,以便在C#项目中使用数字证书或智能卡(X509Certificate2)签署pdf文件。但是当我尝试创建IExternalSignature时,我遇到了这个错误。 根据找到的留档(这里,这里和这里),实现这个过程的方法是使用BouncyCastle库,它允许从数字证书中提取主键,但是,它给我一个错误,我找不到另一种方法来做到这一点。在留档(这里)中,它们是从
当一个人试图使用azure AD承载令牌访问我们的系统时,这个获取和缓存资源令牌的工作流程是不存在的。 所以我的问题是,我如何使用承载令牌来启用它?如何才能像使用OpenIDConnect一样请求额外的资源令牌?是否可以使用ADAL从承载令牌获取授权代码?
下午好 我正在做一个有两个应用程序的项目,第一个是一个php应用程序,它为我提供了一个API。第二个是我正在开发的应用程序(Java8base,no Spring)。我的问题是:我可以使用HttpURLConnection对象使用承载令牌授权吗? 我仍在努力实现这一点,但它似乎使“Authorization”的值为空。 HttpApi.get请求属性(授权));这部分给我一个空响应,我不知道为什么