You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过企业代理访问Google Cloud/Speech API时遇未知异常及访问困难

解决企业代理下访问Google Speech/Cloud API的问题

结合你遇到的代理环境API访问问题,我整理了几个实战中常用的排查和解决方向,帮你一步步搞定:

1. 先补全代理认证(如果需要的话)

你当前代码只设置了代理地址和端口,但很多企业代理要求用户名密码认证,得补充这几个系统属性:

System.setProperty("http.proxyUser", "你的代理用户名");
System.setProperty("http.proxyPassword", "你的代理密码");
System.setProperty("https.proxyUser", "你的代理用户名");
System.setProperty("https.proxyPassword", "你的代理密码");

小提示:如果密码里包含特殊字符,记得先做URL编码再设置

2. 给Google客户端库显式配置代理

单纯设置系统属性有时候会被Google的客户端库忽略,最好在创建SpeechClient时手动指定代理:

// 先定义代理信息
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("x.x.x.x", xxxx));

// 构建带代理的HTTP客户端
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
HttpRequestFactory requestFactory = httpTransport.createRequestFactory(request -> {
    request.setProxy(proxy);
    // 如果代理需要认证,添加认证头
    HttpCredentials proxyCreds = new UsernamePasswordCredentials("代理用户名", "代理密码");
    request.getHeaders().setAuthorization(proxyCreds);
});

// 用自定义HTTP客户端创建Speech配置
SpeechSettings speechSettings = SpeechSettings.newBuilder()
    .setCredentialsProvider(FixedCredentialsProvider.create(credentials))
    .setTransportChannelProvider(SpeechSettings.defaultHttpJsonTransportProviderBuilder()
        .setHttpRequestFactory(requestFactory)
        .build())
    .build();

// 最后创建SpeechClient并使用
try (SpeechClient speechClient = SpeechClient.create(speechSettings)) {
    // 你的API调用逻辑写在这里
}

3. 解决SSL证书验证问题

企业代理通常会替换HTTPS请求的SSL证书,导致JVM验证Google API证书失败。这里分两种情况处理:

  • 测试环境临时方案:禁用SSL验证(生产环境绝对不能用!)
// 跳过所有SSL证书验证
TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() { return null; }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {}
        public void checkServerTrusted(X509Certificate[] certs, String authType) {}
    }
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

// 跳过主机名验证
HostnameVerifier allHostsValid = (hostname, session) -> true;
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
  • 生产环境正确方案:导出企业代理的根证书,导入到JVM信任存储:
keytool -import -alias proxy-root-cert -file /path/to/proxy-root.crt -keystore $JAVA_HOME/jre/lib/security/cacerts

4. 验证Credentials加载是否正常

先确认你的Credentials.json路径正确、文件有读取权限,还可以加一行代码验证加载结果:

System.out.println("已加载的凭证邮箱:" + credentials.getClientEmail());

如果加载失败会抛出IOException,捕获后看具体错误信息就能定位问题。

5. 检查代理是否允许访问Google API域名

有些企业代理会限制特定域名,你可以先用curl测试代理能不能访问Speech API的域名:

curl -x http://x.x.x.x:xxxx https://speech.googleapis.com/v1/speech:recognize

如果返回403或连接超时,说明代理规则限制了访问,得联系IT部门开放speech.googleapis.com等相关Google Cloud域名。


内容的提问来源于stack exchange,提问作者Sip

火山引擎 最新活动