背景
- 产品部署于内网,服务器仅有内网访问权限,无法连接互联网.
- 产品内部有OCR,发票识别等高级场景需要连接外网的云服务.
- 客户可以提供一个dmz区域能够上外网的服务器,并且设置正向代理.
正向代理与反向代理
- 不同于反向代理,正向代理必须修改程序.
- 反向代理的原理:在客户dmz服务器侧使用反向代理的机制代理公网服务器,并且向内网暴露https服务,内网产品服务器通过修改/etc/hosts将原本访问云服务器的服务器地址指向到dmz区域提供https服务的服务器来实现内网访问互联网服务,最大的优点是可以不修改程序,最大缺点是每个站点都需要进行处理.
- 正向代理的原则是在dmz区域的机器设置一个代理, 如果内网服务器要访问外网,需要先登录到正向代理服务器,以正向代理服务器的身份来访问互联网,最大的优点是不区分网站,只要dmz区域可以连接,然后就可以访问.最大的缺点是需要产品修改程序,先登录正向代理服务器再建立https连接.
正向代理的程序修改
- 参照产品部同事的处理, 修改的事项主要如下:
- 参考于:
https://www.jianshu.com/p/b0d36905d435
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
if (!StringUtils.isEmpty(ProxyIP)) {
int port = 80;
if (!StringUtils.isEmpty(ProxyPort)) {
port = Integer.valueOf(ProxyPort);
}
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyIP, port));
builder.proxy(proxy);
if (!StringUtils.isEmpty(ProxyUid) || !StringUtils.isEmpty(ProxyPwd)) {
if ("1".equals(ProxyUid)) {
ProxyUid = "";
}
if ("1".equals(ProxyPwd)) {
ProxyPwd = "";
}
String userName = ProxyUid, password = ProxyPwd;
builder.proxyAuthenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) throws IOException {
//设置代理服务器账号密码
String credential = Credentials.basic(userName, password);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
}
});
}
}
client = builder.connectTimeout(3, TimeUnit.MINUTES)//设置连接超时时间
.readTimeout(3, TimeUnit.MINUTES)//设置读取超时时间
.sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts())
.hostnameVerifier(new TrustAllHostnameVerifier()).build();
1. 需要修改产品的配置表,增加四行配置信息
ProxyIP ProxyPort ProxyUid ProxyPwd
2. 产品在判断有ProxyIP的情况下自动获取后面四项内容, 使用OKHTTP3的方式 建立连接
3. 注意产品需要访问的互联网的网址不需要做任何修改
4. 注意ProxyIP ProxyPort 等信息务必准确,并且保证dmz区域能够访问外网的服务器能够互相联通.
5. Linux可以使用如下命令进行验证.
curl --header "Content-type: application/octet-stream" --header "X-API-KEY:yourkey" -k -v -x yourip:yourport https://someurl/ai/ocr/v1/receipt/classify
6. Windows 下面可以使用 Windows系统的代理服务器进行验证能够上网
验证产品是否可用
- 注意输入api key
- 输入正确的ProxyIP验证可以正常访问,修改为错误的代理IP地址验证无法访问