我们最近遇到了一个错误,该错误似乎是由于 Google 在 Google Apps for Gov 服务上处理 Google Apps 脚本中 SSL 信任的方式发生了变化而引起的。我们有一些 Apps Script 系统——特别是两个是服务器监控系统和基于 Web 服务的日历同步工具——它们通过 SSL 连接与我们端的服务器进行通信。这几个月来一直运行良好,直到 2012 年 9 月 20 日晚上 9 点 15 分,几乎所有这些(和类似的)连接都开始失败,因为无法信任对我们来说是强制性的 DOD 签名证书东西的。
更奇怪的是,这有点不一致——也就是说,我可以成功地要求谷歌连接到https://usuportal.usuhs.mil并且它加载得很好。但是,如果我尝试以下任何一种:
https://www.us.army.mil
https://www.nps.edu
https://www.disa.mil
https://learning.usuhs.edu
......他们都失败了。我怀疑这与某些服务器将自己绑定到的根证书有关,足以让所有将“DOD Root CA-2”证书作为终结者绑定到失败 - 对我们来说是一个真正的问题。
对于我们的服务器监控,我们已经能够通过在 Apps Script 中禁用 SSL 验证来临时解决这个问题,但是该选项不可用于访问 web 服务 [编辑:我们正在使用 SoapService 处理 WS 请求和返回],让我们无法只要存在此问题,就可以继续使用这些工具。不过,鉴于我们可以准确识别相关变化何时发生,我希望谷歌至少(相对)能够快速查明发生了什么。
如果它有帮助,下面是一个快速的 Google Apps 脚本功能,它将根据它是否能够信任端点的 SSL 证书来注销成功/失败。
function checkSSL()
{
// The server to go look at to see if we can trust it.
// Again, usuportal.usuhs.mil has been observed to work; all others tested have failed
//
var serverToTest = "https://www.disa.mil";
// options defines the options which will be used by the UrlFetchApp to define its behavior.
// In this case, we may be interested in disabling SSL validation.
//
var options =
{
"validateHttpsCertificates" : false
};
// First, try without disabling validation
//
try {
response = UrlFetchApp.fetch(serverToTest);
Logger.log("I was able to reach " + serverToTest +" without disabling certificate validation.");
}
catch (e)
{
// Logger.log(e.toString());
Logger.log("I was not able to reach " + serverToTest +" without disabling certificate validation.");
}
// Now let's try it with validation disabled
//
try {
response = UrlFetchApp.fetch(serverToTest, options);
Logger.log("I was able to reach " + serverToTest +" with certificate validation disabled.");
}
catch (e)
{
// Logger.log(e.toString());
Logger.log("I was not able to reach " + serverToTest +" with certificate validation disabled. Maybe it's really just down?");
}
}