可以利用 Bluemix™ Secure Gateway 服务建立连接到后端企业服务的安全连接。本教程将向您展示如何在 Bluemix 中配置服务,如何配置一个 Docker 容器以便从本地机器连接到该服务,以及如何使用 Bluemix 应用程序中的服务,通过 Docker 容器从您的本地机器安全地建立隧道来连接到可用的服务。
您需要一个Bluemix 帐户。
您还需要已经在本地机器上设置和运行应用程序,并准备好以下内容:
“ 这里描述的示例将演示如何使用 Secure Gateway 从 Node.js Bluemix 应用程序连接到 CouchDB。 ”
点击查看大图
关闭 [x]
点击查看大图
关闭 [x]
点击查看大图
关闭 [x]
Bluemix 应用程序使用 Cloud Host:Port 值来连接到本地 CouchDB。Destination Host:Port 设置指定了可从运行在您的本地机器上的 Docker 容器访问的 host:port。
点击查看大图
关闭 [x]
您需要已经设置一个 Ubuntu 虚拟机来运行 Docker。我使用了一个 Ubuntu v14.04.3 虚拟机。关于各种 Ubuntu 版本的 Docker 安装说明,请访问 Docker 网站 。
点击查看大图
关闭 [x]
DOCKER_HOST
和 DOCKER_TLS_VERIFY
(或者您可以在运行时有选择的使用 -H
和 –tlsverify
标志): $ mkdir -pv ~/.docker $ cp DigiCertCA2.pem ~/.docker/ca.pem $ cp xxx_cert.pem ~/.docker/cert.pem $ cp xxx_key.pem ~/.docker/key.pem $ export DOCKER_HOST=tcp://$HOST:2376 DOCKER_TLS_VERIFY=1
要从 Ubuntu 本地机器建立一个安全隧道连接,需要启动 Docker 容器并将其指向 Bluemix Secure Gateway 的目标 ID。在下面的示例中,我使用了 -D
标志来启用调试,确保显示来自该容器的其他任何调试消息。我还使用了 --net="host"
标志,该标志允许我的容器与正在运行该容器的本地服务器(Ubuntu 本地机器)共享网络堆栈。第一次运行此代码时,它会下载该映像。
$ sudo docker -D run --net="host" -it ibmcom/secure-gateway-client qxWAtZ2JWWM_prod_ng [sudo] password for bluemix: IBM Bluemix Secure Gateway Client version 1.0.3 <press enter for the command line> [YYYY-MM-DD HH:MM:SS:MS][INFO] secure tunnel connected
要查看 Docker 命令(不包括上面提到的标志),可以通过浏览到应用程序的概述页面并单击 Secure Gateway 服务来打开 Secure Gateway 仪表板。接下来,单击您的目标( CouchDB )来打开其仪表板。最后,单击 CONNECT GATEWAY 按钮来查看连接选项,尤其是 Docker 命令行。
点击查看大图
关闭 [x]
打开您的浏览器,浏览至 http://cap-sg-prd-5.integration.ibmcloud.com:15133。(或者可以从命令行使用 cURL。)
这会导致以下两个可能的错误之一:ERR_CONNECTION_REFUSED 或 ERR_EMPTY_RESPONSE。这是因为您配置了应用程序来使用 TLS:Mutual Auth,所以在建立连接时客户端应用程序需要使用 TLS。下一步向您展示了如何设置应用程序来传递证书,以便允许建立连接。
在此步骤中,要创建一个简短的 Node.js 应用程序,以便设置到网关的安全隧道,并下移到本地机器。
var tls = require('tls'); var fs = require('fs'); var net = require('net'); var tunnelPort = process.env.VCAP_APP_PORT || 8888; var server; var gatewayOptions = { //host local test to bluemix host: 'cap-sg-prd-5.integration.ibmcloud.com', port: '15133', key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem'), ca: fs.readFileSync('ca.pem') } //create a server end point to use as a network wrapper for the secure gateway server = net.createServer(function (connListener) { console.warn("net server created"); connListener.on('end', function() { console.warn('client disconnected') }); //connect to farside, local/private server connectFarside(connListener, function(err, remoteSocket) { if (err){ console.error(err); } console.warn('connection made') remoteSocket.pipe(connListener); console.warn('remote socket connected to local connListener'); connListener.pipe(remoteSocket); console.warn('local connListener connected to remote socket'); }); }); //setup listener for network wrapper on localhost:tunnelPort //function called when connection established and ready to tunnel requests //when in the function we invoke the callbackRunInTunnel which is where the code //runs to communicate to through the bluemix secure gateway server.listen(tunnelPort, function(){ console.warn('tunnel created at: '+ server.address().address +":"+ server.address().port); }); //create a TLS connection to the secure gateway function connectFarside(conn, callback) { try { console.warn("initiating farside connection"); var socket = tls.connect(gatewayOptions, function() { console.warn('tunnel connected to '+ gatewayOptions.host +":"+ gatewayOptions.port); callback(null, socket); }); socket.on('error', function(err){ console.warn('Socket error: ' + JSON.stringify(err)); }); } catch(err) { console.error(err) callback(err); } };
在运行 securetunnel.js 应用程序之前,需要获得通过 Secure Gateway 服务生成的证书文件,该证书文件已用于 Docker 容器。之前,您下载了一个包含 5 个文件的 zip 文件。复制以下 3 个文件,如下所示:
将这 3 个文件放在您放置 secure-conn.js 应用程序的相同目录中。在运行 securetunnel.js 应用程序时,系统会告诉您在其上创建隧道的主机的主机名和端口。
$ node securetunnel.js tunnel created at: 0.0.0.0:8888
这一次您将使用上一步中由 Node.js 应用程序创建的隧道。您将连接到 http://localhost:8888,而不是连接到 http://cap-sg-prd-5.integration.ibmcloud.com:15133。和以前一样,使用浏览器或 cURL。我在下面使用了 cURL。这次连接正常工作,因为是通过 Node.js 应用程序进行路由的,该应用程序创建了一个连接到 Bluemix Secure Gateway 的 TLS 连接。反过来,该连接被向下路由到本地机器和 CouchDB 实例。
点击查看代码清单
关闭 [x]
$ curl http://127.0.0.1:8888 {"couchdb":"Welcome","uuid":"b03e6f754ca999e2d7a5c919954dc33e","version":"1.6.1","vendor":{"version":"1.6.1-1","name":"Homebrew"}}
接下来,编辑 package.json 文件,告诉它运行 securetunnel.js 而不是 app.js。将代码从
"scripts": { "start": "node app.js" },
更改为以下代码:
"scripts": { "start": "node securetunnel.js" },
这一次您将使用由已部署到 Bluemix 的 Node.js 应用程序创建的隧道。您将连接到 http:// yourappname .mybluemix.net,而不是连接到 http://localhost:8888。无论是使用浏览器还是 cURL,都将获得相同的结果。如果您将 " /_utils/ " 添加到路径名称中 (http://yourappname.mybluemix.net/_utils/),并在您的浏览器中打开它,那么您可以使用 Bluemix 中建立的安全隧道与 CouchDB 进行完全交互。
点击查看代码清单
关闭 [x]
$ curl http://yourappname.mybluemix.net:8888 {"couchdb":"Welcome","uuid":"b03e6f754ca999e2d7a5c919954dc33e","version":"1.6.1","vendor":{"version":"1.6.1-1","name":"Homebrew"}}
在 Bluemix 中创建一个安全网关是如此容易,以致于真的没有必要进行说明,最棘手的部分似乎是如何保障安全和使用连接。本教程中的示例和说明已解释了这个过程的两个细微差别:在 Docker 中使用 TLS 和在您的应用程序中使用 TLS。一旦知道了证书放在哪里,在 Docker 中使用 TLS 就非常简单。在您的应用程序中使用 TLS 更高级一些。提供示例是让您了解如何在 Node.js Bluemix 应用程序中使用启用了 TLS 的安全网关的好方法。
您完成了什么?您:
Secure Gateway :为您的 Bluemix 环境带来了 Hybrid Integration 功能。
相关主题: Docker Ubuntu