天道酬勤,学无止境

在 Firefox 扩展中读取 SSL 证书(Read SSL Certificates in a Firefox Extension)

问题

我正在开发一个可以向用户显示 SSL 证书信息的 Firefox 扩展。 实际信息与浏览器内置的信息相同,但我将尝试布局和其他 UX 信息。

由于 2017 年附加组件被弃用,我一直在使用 Firefox 扩展而不是附加组件,但该项目将在此之前完成。

我正在尝试这里找到的示例,但扩展似乎停止在require("chrome")

接下来,我尝试编写更简单的代码来了解示例的工作原理,但此代码没有附加到请求的通道。 我的代码,减去各种打印语句,如下:

document.getElementById("click_button").addEventListener("click",
  function(e) {
    var url = "https://secure-website-example.google.com";
    xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.addEventListener("error",
      function(e) {
        dumpSecurityInfo(xhr, -1);
     }, false);

    xhr.onload = function(e) {
      dumpSecurityInfo(xhr);
    };
    xhr.send();
  });

function dumpSecurityInfo(xhr, error) {
  var channel = xhr.channel;
  try {
    console.log("Connection status:");
    if (!error) {  console.log("Succeeded"); }
    else        {  console.log("Failed :("); }

    var securityInfo = channel.securityInfo;
  } catch(err) {
    alert(err);
  }
}

有这样的清单:

  "manifest_version": 2,
  "name": "Certificate Browser",
  "version": "1.0",
  ...

  "permissions": [
    "activeTab",
    "webRequest",
    "https://secure-website-example.google.com/*"
  ],

  "browser_action": {
    ...
    "default_popup": "popup/certificate_information.html"
  }

我是否缺少访问证书所需的任何权限? 有没有更好的方法来获取证书信息?

回答1

您链接到的 wiki 页面指的是插件 sdk 和引导扩展中可用的 API。 清单类型表明您正在编写一个更加有限的网络扩展。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在 Selenium Web Driver 中使用 SSL 证书?(How to use SSL certificates in Selenium Web Driver?)
    问题 我在 Windows 7 上使用 Selenium Web 驱动程序。 我正在尝试测试一个使用身份验证的网站,我需要使用 SSL 证书。 当我在 Selenium 之外使用 Firefox 时一切正常,但我注意到 Selenium 打开的 Firefox 浏览器会话没有注册任何证书,因此很明显它不起作用。 这是我在 Selenium 之外使用 Firefox 时的高级首选项 当我使用 Selenium 打开的 Firefox sessione 时,你也是一样 我试图保持会话打开并手​​动注册证书,但浏览器会话未注册证书。 如果有用的话,这是我的代码 package myTestProjects; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class GAMOPERA_Test_01 { private static WebDriver driver = null; public static void main(String[] args) throws InterruptedException
  • 有没有办法使Firefox忽略无效的ssl证书?(Is there a way to make Firefox ignore invalid ssl-certificates?)
    问题 我正在维护一些Web应用程序。 开发和质量保证环境使用无效/过时的ssl证书。 尽管通常这是一件好事,但是Firefox让我像十几次一样单击以接受证书,这很烦人。 是否有使Firefox(可能还有IE)接受任何ssl证书的配置参数? 编辑:我接受了解决方案,那是行得通的。 但是,感谢所有建议使用自签名证书的人。 我完全知道,被接受的解决方案给我留下了一个巨大的安全漏洞。 尽管如此,我还是懒得为所有应用程序和所有环境更改证书... 但是我也强烈建议任何人不要启用验证功能! 回答1 转到工具>选项>高级“制表符”(?)>加密选项卡 点击“验证”按钮,然后取消选中复选框以检查有效性 请注意,这是非常不安全的,因为它会使您敞开大门接受任何无效的证书。 仅当在Intranet上使用浏览器(证书的有效性与您无关或您通常不关心)时,我才这样做。 回答2 尝试添加例外:FireFox->工具->高级->查看证书->服务器->添加例外。 回答3 尝试访问我的公司Intranet网站之一时遇到了这个问题。 这是我使用的解决方案: 在firefox地址栏中输入about:config并同意继续。 搜索名为security.ssl.enable_ocsp_stapling的首选项。 双击该项目以将其值更改为false。 这将降低您的安全性,因为您将能够查看带有无效证书的站点。
  • 如何使用 Selenium [在 Python 中] 为 Firefox 导入 SSL 证书?(How to import SSL certificates for Firefox with Selenium [in Python]?)
    问题 试图找到一种使用 Python WebDriver 和 FirefoxProfile 在带有 Selenium 的 Firefox 中安装特定 SSL 证书的方法。 我们需要使用我们自己的自定义证书,该证书存储在运行 WebDriver 的计算机中,因此理想的解决方案如下所示: profile = get_my_profile() profile.importCertificate('/my/certificates/my_cert.cert') driver = new webdriver.Firefox(profile=profile) 我怎样才能做到这一点? 非常感谢! 回答1 从这个答案 Webdriver 没有用于添加个人证书的内置机制。 如果您使用的是 Firefox,我发现这样做的唯一方法是创建一个 Firefox 配置文件并将证书添加到其中。 然后,您可以在运行测试时重用配置文件,或者,这是我的首选选项,将 cert8.db 和 key3.db 文件添加到 webdriver 在运行时创建的配置文件中。 - 德里克·艾金斯 尽管下一个答案提供了一种解决方法。
  • 在 Firefox 中,我可以禁用“由未知机构认证的网站”SSL 证书警告对话框吗?(In Firefox, can I disable the “Website certified by an unknown authority” SSL certificate warning dialogs?)
    问题 即我只是希望他们一直被永久接受。 回答1 你不能。 其他人回答了这个问题,请仔细阅读。 他不是在问如何添加例外或修复损坏的证书。 他想彻底取消支票。 Mozilla 的人在谨慎方面犯了错误,使这成为不可能。 一方面这很烦人,但另一方面,他们的安全心态是 Firefox 比 IE 安全得多的原因之一。 如果您想让例外更容易一点,请在地址栏中输入“about:config”(无引号),然后在过滤器中输入 browser.ssl_override_behavior,双击“值”,并将其更改为“2 ”。 现在例外需要少点击一次。 回答2 查看透视 Firefox 插件。 它使 Firefox 3 自动接受自签名证书。 http://www.cs.cmu.edu/~perspectives/ 回答3 这就是答案! * Tools -> Options -> Advanced -> Encryption -> View Certificates * Under Authorities tab, enter "RSA Security 1024" in the Search textbox. * Select RSA Security 1024 V3 and press the Edit button. * Uncheck all three options * Press OK and
  • Firefox中使用WebDriver和C#的不受信任的SSL证书(Untrusted SSL Certificates in Firefox Using WebDriver and C#)
    问题 更新:我升级到硒2.37,但仍然有同样的问题! 最新编辑:定义首选项后仍无法使用(请参见下文) //some more prefs: profile.SetPreference("network.http.phishy-userpass-length", 255); profile.SetPreference("network.automatic-ntlm-auth.trusted-uris", _url); profile.SetPreference("webdriver_assume_untrusted_issuer", true); profile.SetPreference("webdriver_accept_untrusted_certs", true); profile.SetPreference("trustAllSSLCertificates", true); 我正在使用FF 25.0.1 Webdriver版本:2.31 我以前从未遇到过这个问题,但是只是在我开始运行自动化测试用例时才开始的,所以发生的事情是我遇到SSL认证错误,即使我已经接受并添加为例外,但仍然收到错误并因此进行了测试案件失败了... 这是我在构建ff webdriver时添加的内容... FirefoxProfile profile = new FirefoxProfile()
  • 使用MailChimp的API的SSL错误(SSL errors using MailChimp's API)
    问题 我正在尝试连接MailChimp的API,但始终出现错误: 错误。 对列表/列表的API调用失败:SSL对等证书或SSH远程密钥不正确 然后,我创建了一个cacert.pem文件,并将其设置在Mailchimp.php文件中: $this->ssl_cainfo = ROOT . DS . 'cacert.pem'; 并得到这个: 错误。 对列表/列表的API调用失败:SSL证书问题,请验证CA证书是否正常。 详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 或者 错误。 对列表/列表的API调用失败:SSL对等证书或SSH远程密钥不正确 在此页面上: 我尝试将http://curl.haxx.se/docs/caextract.html文件用于cacert.pem文件,但是出现上面列出的“ not OK”错误。 我还尝试使用主机提供的信息来制作自己的信息(一个文本文件,将扩展名更改为.pem,然后将一个和/或两个数据块粘贴到其中,使其看起来像这样): -----BEGIN CERTIFICATE----- adjkflsdjflkasjdflkajdflksdflsdfkj asldfkjaadsfhjkfhdsajkfhakjdhfkjdh .... -----END CERTIFICATE----- --
  • 如何使用硒处理证书?(How to deal with certificates using Selenium?)
    问题 我正在使用Selenium启动浏览器。 如何处理要求浏览器接受证书的网页(URL)? 在Firefox中,我可能有一个类似的网站要求我接受这样的证书: 在Internet Explorer浏览器上,我可能会得到以下信息: 在谷歌浏览器上: 我重复我的问题:当我启动使用Selenium(Python编程语言)的浏览器(Internet Explorer,Firefox和Google Chrome)时,如何自动接受网站的证书? 回答1 对于Firefox,您需要将accept_untrusted_certs FirefoxProfile()选项设置为True : from selenium import webdriver profile = webdriver.FirefoxProfile() profile.accept_untrusted_certs = True driver = webdriver.Firefox(firefox_profile=profile) driver.get('https://cacert.org/') driver.close() 对于Chrome,您需要添加--ignore-certificate-errors ChromeOptions()参数: from selenium import webdriver options =
  • 自签名和/或过期的 HTTPS 证书是否比仅使用 HTTP 更糟糕?(Is self-signed and/or expired HTTPS certificates worse than just using HTTP?)
    问题 尽管您收到了一个巨大的红色威胁警告,告诉您该证书尚未通过其中一个证书颁发机构的验证或已过期,但与仅使用 HTTP 相比,它有什么坏处? 是否更糟? 根据谷歌浏览器 (http://www.sslshopper.com/assets/images/chrome-beta-ssl-2.png) « 攻击者可能正试图拦截您的通信 »。 是什么让这个浏览器和几乎所有其他浏览器在自签名/过期证书的情况下(并且我没有编写明确验证为无效的证书)而不是在使用 HTTP 浏览的情况下发出此警告? 再说一次,它是否比使用 HTTP 浏览更不安全? 使用自签名 HTTPS 证书浏览网站显然比使用 HTTP 浏览完全相同的网站更具威胁性,那么这些现代浏览器行为是否是骗局,让诚实的公司购买他们可能不需要的 SSL 证书? 回答1 自签名证书严格来说并不比由信誉良好的 CA 签名的证书差,并且在所有技术方面都比普通 HTTP 好。 从签名和加密的角度来看,它们是相同的。 两者都可以对流量进行签名和加密,因此其他人无法窥探或进行修改。 不同之处在于将证书指定为受信任的方式。 使用 CA 签名证书,用户信任他们在浏览器/操作系统中安装的一组受信任的 CA。 如果他们看到由其中一个签名的证书,他们就会接受它,一切都很好。 如果不是(例如在自签名时),您会收到一个可怕的警告。
  • 与Tomcat 7相互认证(Mutual authentication with Tomcat 7)
    问题 我正在尝试将运行在Tomcat 7中的Java Web服务设置为使用双向(双向)身份验证。 无论我做什么,似乎都无法在安全端口上连接服务。 这是我创建证书和密钥库等的工作: //create the key and certificate for the tomcat server. keytool -genkey -v -alias tomcat -keyalg RSA -validity 3650 -keystore tomcat.keystore //create the key and certificate for the client machine. keytool -genkey -v -alias clientkey -keyalg RSA -storetype PKCS12 -keystore client.p12 //export the client key keytool -export -alias clientkey -keystore client.p12 -storetype PKCS12 -rfc -file client.cer //import the client key into the server keystore keytool -import -v -file client.cer -keystore tomcat
  • 如何在 Apache 上为虚拟主机设置不同的 SSL 证书?(How can I setup different SSL-Certificates for vhosts on Apache?)
    问题 我有一台 web 服务器,它提供不同的域名,但只分配了一个 IP 地址。 这适用于 Apache 中的虚拟主机。 现在我想要网站的 SSL 加密连接。 如何为不同的虚拟主机设置不同的 SSL 证书? 为不同的主机名使用不同的 IP 将是一种解决方案 - 不是很优雅但可能。 但我想知道,如何为不同的虚拟主机使用不同的 SSL 证书。 所以我寻找一种只有一个 IP 地址的解决方案。 回答1 更新:2013 随着旧浏览器的淘汰,SNI 似乎终于开始站稳脚跟。 这里是 Apache SNI 的文档,这里是关于 SNI 的维基百科文章,其中包括支持它的浏览器的图表。 简而言之,所有主流浏览器都在支持的版本中支持它; 如果支持旧浏览器很重要,您可能必须考虑到这一点。 ------ 以前的回答-------------- SSL 主机必须绑定到唯一的 IP 地址/端口组合,因此您不能使用虚拟主机(或者至少,每个 IP 地址只能有一个 ssl 主机)。 这是因为 https 在 Host: 参数在 http 中发送之前开始加密,因此它无法根据主机名确定使用哪种密码 - 它只有 IP 地址。 如果 HTTP 有一个 TLS 命令,这样它就可以在询问主机名后启动 SSL,这将很容易解决,但没有人问我。 有关明确的答案,请参阅 http://httpd.apache.org/docs/2.0
  • 使用Python验证SSL证书(Validate SSL certificates with Python)
    问题 我需要编写一个脚本,该脚本通过HTTPS连接到我们企业内部网上的许多站点,并验证其SSL证书是否有效; 这些证书尚未过期,为正确的地址颁发证书等。我们对这些站点使用内部的公司证书颁发机构,因此我们拥有CA的公钥来验证证书。 默认情况下,Python在使用HTTPS时仅接受并使用SSL证书,因此,即使证书无效,诸如urllib2和Twisted之类的Python库也会很乐意使用该证书。 是否有一个好的库可以让我通过HTTPS连接到站点并以这种方式验证其证书? 如何在Python中验证证书? 回答1 从版本2.7.9 / 3.4.3开始,Python默认情况下会尝试执行证书验证。 这在PEP 467中已提出,值得一读:https://www.python.org/dev/peps/pep-0476/ 所做的更改会影响所有相关的stdlib模块(urllib / urllib2,http,httplib)。 相关文件: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection 现在,此类默认情况下执行所有必要的证书和主机名检查。 要恢复为先前未验证的行为,可以将ssl._create_unverified_context()传递给context参数。 https://docs.python.org
  • SSL_connect 返回=1 errno=0 state=SSLv3 读取服务器证书B:证书验证失败(SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)
    问题 我正在使用 Authlogic-Connect 进行第三方登录。 运行适当的迁移后,Twitter/Google/yahoo 登录似乎工作正常,但 facebook 登录引发异常: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed 开发日志显示 OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed): app/controllers/users_controller.rb:37:in `update' 请提出建议。 回答1 尝试将JQuery生成器用于Rails 3时遇到了类似的问题 我这样解决了: 获取CURL证书颁发机构(CA)捆绑包。 您可以使用以下方法执行此操作: sudo port install curl-ca-bundle [如果使用MacPorts] 或直接将其拉下wget http://curl.haxx.se/ca/cacert.pem 执行试图验证SSL认证的红宝石代码: SSL_CERT_FILE=/opt/local/etc
  • urllib和“ SSL:CERTIFICATE_VERIFY_FAILED”错误(urllib and “SSL: CERTIFICATE_VERIFY_FAILED” Error)
    问题 我收到以下错误: Exception in thread Thread-3: Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run self.__target(*self.__args, **self.__kwargs) File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process info = urllib2.urlopen(req).read() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen return opener.open(url, data, timeout)
  • SSL证书被拒绝尝试通过防火墙后的HTTPS访问GitHub(SSL certificate rejected trying to access GitHub over HTTPS behind firewall)
    问题 我被困在防火墙后面,因此必须使用HTTPS来访问我的GitHub存储库。 我在Windows XP上使用cygwin 1.7.7。 我尝试将遥控器设置为https://username@github.com/username/ExcelANT.git ,但是在提示输入密码时提示我,但是一旦输入密码就什么也没做。 https://username:<password>github.com/username/ExcelANT.git并从头开始克隆空的https://username:<password>github.com/username/ExcelANT.git ,但是每次给我相同的错误 错误:SSL证书问题,请验证CA证书是否正确。 细节: 错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:访问https://github.com/username/ExcelANT.git/info/refs时证书验证失败 开启GIT_CURL_VERBOSE=1给我 *关于connect()到github.com端口443(#0) *尝试207.97.227.239 ... *成功设置证书验证位置: * CAfile:无 CApath:/ usr / ssl / certs * SSL证书问题,请验证CA证书是否正确。 细节: 错误
  • 如何在 GAE 上设置中间证书?(How to set the intermediate certificates on GAE?)
    问题 我已经为我的自定义域购买了 SSL 认证并设置了我的 GAE 项目。 它适用于大多数浏览器,直到新的 Firefox 版本问世。 Firefox 拒绝了我的 SSL 认证。 我使用过 SSL Checker,它给了我反馈。 “并非所有 Web 浏览器都信任该证书。您可能需要安装中间/链证书以将其链接到受信任的根证书。了解有关此错误的更多信息。您可以按照适用于您的服务器平台的 GoDaddy 证书安装说明进行修复.注意中级证书部分。” 我曾尝试谷歌如何设置中间证书,但没有找到。 有没有人遇到过同样的问题并知道如何解决? 回答1 看起来这些方向会帮助你。 它们用于不同的 CA,但逻辑应该是相同的。 由于 Google App Engine 没有单独的选项来上传中间证书,因此您必须将此证书包含在公钥文件中。 您可以通过在纯文本编辑器中打开您网站的证书和 GlobalSign 的中间证书来完成此操作,只需将中间证书中的所有内容复制并粘贴到 GlobalSign 颁发的网络服务器证书文件的末尾即可。 Google AppEngine Docs 说这是正确的做法,但他们没有进入与另一个链接相同级别的详细信息。 如果主机证书需要中间证书或链接证书(与许多证书颁发机构 (CA) 颁发的证书一样),您需要将中间证书或链接证书附加到公共证书文件的末尾。 回答2 如果您在尝试在 AppEngine
  • 在Chrome扩展程序中获取当前页面的SSL证书的指纹(Get fingerprint of current page's SSL certificate in a Chrome extension)
    问题 我正在尝试编写一个扩展程序,用于与第三方验证站点的SSL证书的SHA1指纹。 但是,似乎不可能通过本机JavaScript或Chrome的扩展API来执行此操作。 我发现这个问题似乎可以满足我的要求:如何获取Firefox扩展中* current *页面的SSL证书信息 但不幸的是,它仅适用于Firefox。 有没有办法以跨浏览器兼容的方式来做到这一点,甚至只是在Chrome中也是如此? 回答1 截至2014年1月为止(但文件中有错误报告)。 火狐浏览器 Firefox当前仅能被动地提供证书信息,而没有任何扩展API就能阻止被认为具有不适当证书的连接。 Mozilla错误#644640-“扩展的实现扩展点,以影响PSM中的信任决策”,该跟踪正在跟踪拒绝连接的能力。 铬 另一方面,Chrome甚至不让您首先检查证书。 Chromium问题#107793 —“提供有关通过webRequest API与扩展名进行TLS连接的信息”,该信息似乎既可以跟踪简单地检查证书的能力,又可以跟踪撤销信任(如果需要)的能力。 (还有一个较早的Chromium问题#49469-“功能请求:实现扩展API来访问有关网页的HTTPS / SSL证书的信息”,但似乎问题#107793已被接管。) 与上面的问题107793链接的Chromium API提案草案(请注意,这只是拟议接口的草案
  • 使用 ssl 和客户端证书 (uploadReadAheadSize) 时上传大文件但不希望预读所有数据(Large file upload when using ssl and client certificates (uploadReadAheadSize) but dont want all data to be readahead)
    问题 我试图搜索互联网/堆栈溢出,但找不到任何对我有用的相关答案。 我有一个 asp.net web api2 应用程序(仅使用 ssl)。 我正在尝试允许大文件上传(最多 ~36mb),但除非我更改 uploadReadAheadSize 以预读这个大小,否则我会从 IIS 收到请求太长的错误。 我不想设置该属性,因为这样我的数据流只会在 IIS 读取完所有内容后才到达。 我的问题是:如何使用 asp.net 托管并和 web api 2 进行大文件上传,而无需配置大的uploadreadaheadsize? 因为我采取的所有步骤似乎都不够。 上传预读大小: 指定 Web 服务器将读入缓冲区并传递给 ISAPI 扩展或模块的字节数。 每个客户端请求都会发生一次。 ISAPI 扩展或模块直接从客户端接收任何附加数据。 该值必须介于 0 和 2147483647 之间。默认值为 49152。 如果我不设置 uploadReadAheadSize 并尝试通过 ssl 上传大文件,则会出现以下错误: HTTP 错误 413.0 - 请求实体太大你可以尝试的事情:页面没有显示,因为请求实体太大。 最可能的原因: Web 服务器拒绝为请求提供服务,因为请求实体太大。 Web 服务器无法为请求提供服务,因为它正在尝试协商客户端证书但请求实体太大。 请求 URL 或 URL 的物理映射(即
  • 你如何签署你的 Firefox 扩展?(How do you sign your Firefox extensions?)
    问题 我已经为 Firefox 开发了几个扩展,并且对扩展签名如此困难感到恼火。 当扩展程序未签名时,它会在安装时显示“作者未验证”,对我来说这看起来是错误的。 我有一个简单的构建脚本,可以从源代码构建我的 .xpi 文件,并且我有 PKZip 的许可副本(根据许多教程需要构建 Firefox 需要的签名 xpi 文件),但我还没有找到一种获得实际有效的免费/廉价证书的方法或一组可以解决问题的说明。 由于我的扩展是免费的,我不想在商业证书上花费 400 美元,但我不介意花费 50 美元左右来完成它。 我有 Linux 和 Windows 机器,尽管我的构建脚本目前使用 Windows,而且使用起来最方便。 你是怎么解决这个问题的? 我需要做什么才能在构建时自动安全地签署我的扩展? 编辑:我很欣赏谷歌的点击率,但他们提供的步骤在如何实际获得有效的证书方面还不够完整。 我得到的感觉让我想起了这部经典: 回答1 我使用了 comodo 证书来签署 XPI。 这是当时最便宜的选择。 我已经写了几篇关于 XPI 格式的文章以及使用 java 命令行工具进行签名的方法。 我的工具 XPISigner 大大简化了过程,并且可以集成到构建系统中。 我已删除该工具,因为它不再适用于 FF4 或更高版本。 如果有人想修复,可以在 http://code.google.com/p/xpisigner/
  • SSL:在中间攻击中如何保护证书免遭人为攻击?(SSL: How are certificates protected against man in the middle attacks?)
    问题 我的问题是专门针对ssl中的证书的,但我认为这些问题应适用于所有证书。 为了清楚起见,我包括了SSL过程。 在SSL中,我了解的过程是: 1)客户 发送支持的加密算法发送客户随机数 服务器 选择(并发送)一个对称算法公钥算法 MAC算法发送它的证书发送服务器随机数 客户 验证证书提取公钥生成预主密钥(pms) 用服务器公钥加密并发送 客户端和服务器 计算来自PMS和随机数的主密钥(MS) 对PMS进行切片以生成两个加密和两个Mac密钥 客户 发送所有握手的Mac(以确保以前未对其进行修改) 服务器 发送所有握手的信号 问题 是什么阻止了中间人的攻击在第二步发生? 为什么中间没有一个人,比如说鲁迪,要捕获服务器发送的证书并更改其中的公钥(更改为具有私钥的东西)。 我假设证书以某种方式进行了加密。 但是,服务器无法加密证书,因为客户端还没有公钥。 当服务器从授权机构(如Veri-Sign)获取密钥时,是否将使用Verisign的公钥对密钥进行预加密? 我认为这应该可行,因为所有Web浏览器都应具有大多数权限的公钥。 回答1 否,证书未加密。 但是它是由证书颁发机构(CA)签名的。 由于这些人会检查证书中包含的信息(尤其是证书所属的URL),因此对于给定的URL不应有第二个有效的证书。 根据信任库(例如,在您的浏览器中)检查CA的证书。 如果此信任库遭到破坏,或者您信任无效的证¹
  • Android上的Apache HttpClient产生CertPathValidatorException(IssuerName!= SubjectName)(Apache HttpClient on Android producing CertPathValidatorException (IssuerName != SubjectName))
    问题 我正在开发一个Android应用程序以访问一些Battle.net(https://eu.battle.net)帐户数据(用于《魔兽世界》),并且正在使用org.apache.http.client.HttpClient进行此操作。 这是我正在使用的代码: public static final String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)"; public static class MyHttpClient extends DefaultHttpClient { final Context context; public MyHttpClient(Context context) { super(); this.context = context; } @Override protected ClientConnectionManager createClientConnectionManager() { SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme(