Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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# 以编程方式驱动证书颁发机构(C或C+;+;)_C#_Ssl_Digital Signature_Digital Certificate - Fatal编程技术网

C# 以编程方式驱动证书颁发机构(C或C+;+;)

C# 以编程方式驱动证书颁发机构(C或C+;+;),c#,ssl,digital-signature,digital-certificate,C#,Ssl,Digital Signature,Digital Certificate,我正在编写一个客户机/服务器应用程序,该应用程序要求服务器能够对客户机进行身份验证,并要求对所有通信进行加密 提供此功能的机制需要在服务器和客户端应用程序中自包含,并且还需要完全自动化(不需要人工交互)。SSL似乎是实现这一点的最佳方法,也是我熟悉的使用方法 对于每个需要部署客户端软件的客户端,我计划(动态地)创建一个带有应用程序的MSI安装程序、客户端证书(由服务器签名)、私钥和服务器公共证书(以便客户端可以验证服务器-服务器证书可以自签名) 我可以为客户端生成密钥并生成CSR,但似乎无法找到

我正在编写一个客户机/服务器应用程序,该应用程序要求服务器能够对客户机进行身份验证,并要求对所有通信进行加密

提供此功能的机制需要在服务器和客户端应用程序中自包含,并且还需要完全自动化(不需要人工交互)。SSL似乎是实现这一点的最佳方法,也是我熟悉的使用方法

对于每个需要部署客户端软件的客户端,我计划(动态地)创建一个带有应用程序的MSI安装程序、客户端证书(由服务器签名)、私钥和服务器公共证书(以便客户端可以验证服务器-服务器证书可以自签名)

我可以为客户端生成密钥并生成CSR,但似乎无法找到一种方法来实际签署CSR并为客户端生成证书。我研究了Win32 Crypto API,但没有找到任何关于如何实际签署CSR和获取客户端证书的示例

我知道如何使用openssl工具从命令行执行所有这些操作,但不确定如何在应用程序中执行

请注意,让系统调用openssl工具并传递我知道可以工作的参数不是一个选项,因为依赖openssl工具不会以任何方式受到损害会带来巨大的安全风险。这样做并不能满足自给自足的需求

我正在以正确的方式进行这项工作,或者是否有更好的方法来实现同样的事情-基本上是对连接到服务器的客户端进行身份验证,以及连接客户端对连接到的服务器进行身份验证的方法,都是加密的

我不能假设服务器(或客户端)具有静态IP或主机名(DNS可能会被破坏),也不能假设任何现有PKI基础设施

<>我主要是在C .net中写的,但是如果它给我这个功能,我会考虑写一个C++扩展。 最后,这是我在这里的第一篇帖子,所以如果我遗漏了一些明显的内容或缺少任何细节,请询问,我会填补空白:)

谢谢


James

在C#中,您可以使用我们的SecureBackbox产品包,它提供了您在.NET中寻找的所有功能。也许BouncyCastle库也包含此功能。

您至少需要重新考虑其中的一部分。你所做的完全是不安全的。客户端的私钥需要在客户端生成。否则它不是私有的,所以它不可能满足PKI的任何原则,。包括你发行它的目的。你失去了独特性,也失去了不可抵赖性。这两个都是致命的缺陷。

这并不疯狂——如果他使用嵌入的密钥生成安装程序包,只要他控制对该包的访问,那么唯一可以额外访问该密钥的人就是他——他可以暗中信任他——以及终端系统上的超级用户,他们无论如何都可以读取密钥。另一种选择是在安装程序中嵌入一个签名令牌,而安装的客户端在生成自己的密钥后可以使用该令牌向远程CA服务进行身份验证,但设置起来要麻烦得多,因为不会获得更多的收益。EJP的积分在某一点上是有效的,我理解客户机应该是其密钥的唯一所有者,但为了实现这一点,在服务器可以信任客户机签署客户机证书之前,还需要在其之上使用其他机制来向服务器验证该客户机。如果你能想出一个更好的机制来实现同样的事情,那么让我知道客户端如何生成CSR并将其发送到服务器,而服务器上没有我控制的内容,也不知道服务器的地址或证书。这条链的某个地方会有一个薄弱环节,这正是放置它的最佳位置——我认为服务器无论如何都应该是安全的,因为所有敏感数据都将在这里处理并管理客户端。我的建议是:不要在安装程序中包含密钥和签名证书,而是在服务器数据库中存储一个随机令牌。客户端可以生成自己的证书,然后将该证书加上令牌发送给您的CA。CA检查令牌是否有效,签署证书请求,然后将令牌从列表中划掉,以便不能重复使用。所以每个安装程序都是一个一次性的包,和现在一样。如果它安装在错误的PC上,则您可以取消对相关客户端证书的访问,并重新启用令牌,以便重新使用安装程序。但我认为这太过分了。是的,这是一个值得进一步发展的想法,我还没有想到。谢谢你的帮助!这样做会使安装程序包变得脆弱,这(如果我是一个邪恶的实体)将是我要攻击/窃取的部分,并且没有办法解决这个问题(除了小心让安装程序撒谎等,并应用一些常识).我查看了BouncyCastles LIB,要么找不到,要么他们没有我想要做的例子。另一方面,Blackbox做的是,它会做我想做的事情,只是要说服老板它值得买!