C#学习教程:自动从远程主机下载X509证书链它的部分执行要求它执行一个Java可执行文件,该可执行文件通过SSL与某些Web资源和服务进行通信。如果它通过SSL做一些事情并且它没有远程证书链中的每个证书,那么Java绝对适合。所以在.net中,我需要能够专门访问https://[whatever].com资源,并需要它在本地下载整个远程链。为什么我要自动执行此操作?因为我想简化部署,而不必这样做4次,然后每次其中一个Oracle证书过期时再做一次。我这样做:X509Certificate2lowestCert=SecurityHelper.DownloadSslCertificate(keyDownloadLocation);X509Chain链=newX509Chain();chain.Build(lowestCert);整数计数器=0;foreach(X509ChainElementelinchain.ChainElements){//提取证书X509Certificate2chainCert=el.Certificate;//想出一个别名并保存位置stringalias=certBaseName+counter;stringlocalLocation=Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)+@""+alias+".cer";//保存到本地SecurityHelper.SaveCertificateToFile(chainCert,localLocation);//删除(如果可能)并添加到java的密钥库deleteKeyFromKeystore(javaFolder,alias,certKeyStore,SecurityHelper.GetEncryptedAppSetting("JavaKeystorePassword"));addKeytoKeyStore(localLocation,javaFolder,alias,certKeyStore,SecurityHelper.GetEncryptedAppSetting("JavaKeystorePassword"));//然后删除if(File.Exists(localLocation))File.Delete(localLocation);计数器++;SecurityHelper.DownloadSslCertificate是一种从网站URL创建X509Certificate2的自定义方法“cert”是最低级别的证书,我可以取回它,但我不能做的是将所有内容都放到链上。chain.ChainElements仍然只有1级深,如果链的其余部分尚未安装在机器上。我的问题是这是一个全新的URL,具有完全未知的(对机器而言)证书,我想进入堆栈并递归下载每个证书。有没有办法找到机器未知的URL并以编程方式下载链中的每个证书?编辑:这是我下载SSL证书的方式:publicstaticX509Certificate2DownloadSslCertificate(stringstrDNSEntry){X509Certificate2cert=null;使用(TcpClientclient=newTcpClient()){client.Connect(strDNSEntry,443);SslStreamssl=newSslStream(client.GetStream(),false,newRemoteCertificateValidationCallback((sender,certificate,chain,sslPolicyErrors)=>{returntrue;}),null);尝试{ssl.AuthenticateAsClient(strDNSEntry);}catch(AuthenticationExceptione){ssl.Close();客户端.Close();返回证书;}catch(Exceptione){ssl.Close();客户端.Close();返回证书;}cert=newX509Certificate2(ssl.RemoteCertificate);ssl.关闭();客户端.Close();返回证书;编辑#2获取对我有用的远程ssl证书的解决方案是捕获在SslStream.AuthenticateAsClient(url)期间发生的验证回调中的链;私有静态X509ChainElementCollectioncallbackChainElements=null;privatestaticboolCertificateValidationCallback(Objectsender,X509Certificate证书吃,X509Chain链,SslPolicyErrorssslPolicyErrors){callbackChainElements=chain.ChainElements;返回真;然后用这个回调开始验证,我有类似的东西:publicstaticX509Certificate2DownloadSslCertificate(stringurl){X509Certificate2cert=null;=newTcpClient()){client.Connect(url,443);SslStreamssl=newSslStream(client.GetStream(),false,CertificateValidationCallback,null);试试ssl.AuthenticateAsClient(url);//将调用CertificateValidationCallback}...等等然后,当AuthenticateAsClient完成时,本地“callbackChainElements”变量被设置为X509ChainElements的集合我实际上使用Powershell做了一些非常相似的事情。其中一项是更改ServicePointManager以忽略SSL验证(因为您可能没有本地根证书,这听起来像是)。将ServerCertificateValidationCallback设置为true,它告诉您正在使用自定义验证(或者在您的情况下,可能没有验证)。从那里开始,你的大部分时间都是关于你的联盟。您可以使用导出方法将证书导出为字节数组:foreach(X509ChainElementelinchain.ChainElements){varcertToCreate=el.Certificate.Export(X509ContentType.Cert);...}从那里,只需使用字节数组做你想做的事。您可以将它传递给另一个证书对象的构造函数,然后可以将其导入Java密钥库。希望对您有所帮助,如果您还有其他问题,请告诉我。编辑:实际上,我刚刚注意到关于在.NET中使用X.509证书的提示。作者建议不要直接从字节数组写入,因为它会将临时文件写入不会被清除的目录。所以他的建议是将字节数组写入磁盘,然后在完成后手动清理它。以上就是C#学习教程:自动从远程主机下载X509证书链共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
