我们目前正在为SVRCONN通道实现安全出口。此出口将向我们的LDAP(AD或UNIX)进行身份验证。我们当前的出口实现仅适用于来自MQ EXPLORER的连接。
当我们编写代码进行连接并传递userID/PWD时,安全出口将获取客户端机器上的用户帐户登录。
以下是我们如何连接到MQ 的片段
代码:
MQCNO ConnectOptions = {MQCNO_DEFAULT};
MQCD ClientConn = {MQCD_CLIENT_CONN_DEFAULT};
MQCSP mqCSP = {MQCSP_DEFAULT};
MQHCONN HConn;
MQLONG CompCode;
MQLONG Reason;
char QMName[MQ_Q_MGR_NAME_LENGTH+1]="QMGRNAME";
char channelName[MQ_CHANNEL_NAME_LENGTH+1]="MY_CHANNEL";
char hostname[1024]="MQSERVER(PORT)";
char UserId[32+1]="MyID";
char Password[32+1]="MyPWD";
strncpy(ClientConn.ConnectionName, hostname, MQ_CONN_NAME_LENGTH);
strncpy(ClientConn.ChannelName, channelName, MQ_CHANNEL_NAME_LENGTH);
mqCSP.AuthenticationType = MQCSP_AUTH_USER_ID_AND_PWD;
mqCSP.Version = MQCSP_VERSION_1;
mqCSP.CSPUserIdPtr = &UserId;
mqCSP.CSPUserIdOffset = 0;
mqCSP.CSPUserIdLength = strlen(UserId);
mqCSP.CSPPasswordPtr = &Password;
mqCSP.CSPPasswordOffset = 0;
mqCSP.CSPPasswordLength = strlen(Password);
ConnectOptions.SecurityParmsPtr = &mqCSP;
ConnectOptions.SecurityParmsOffset = 0;
ConnectOptions.ClientConnPtr = &ClientConn;
ConnectOptions.Version = MQCNO_VERSION_5;
MQCONNX (QMName, &ConnectOptions, &HConn, &CompCode, &Reason);
然后,我们使用此代码来检索安全出口上的userID/PWD。代码:
memset (User, 0, pChDef->LongRemoteUserIdLength);
memset (Pass, 0, MQ_PASSWORD_LENGTH);
MakeCString(User,pChDef->LongRemoteUserIdPtr,pChDef->LongRemoteUserIdLength);
MakeCString(Pass,pChDef->RemotePassword,MQ_PASSWORD_LENGTH);
MQ服务器->7.1.0.2
既然有一种廉价的产品可以针对LDAP服务器进行身份验证,你为什么要重新发明轮子?如果您花了一天以上的时间对此进行编程,那么您本可以购买MQ Authenticate Security Exit的许可证并执行其他操作。
MQ仅以纯文本形式传递密码。如果您熟悉MQ或只使用WireShark,因为它知道/理解MQ协议,那么很容易获取该密码。
MQ使用两种不同的方式在客户端和服务器之间传递UserID和Password:"旧"one_answers"新"。不同的平台支持不同的风格。有些直接支持,有些间接支持,有些平台同时进行转换和流(非常奇怪!)。
如果您的所有应用程序都可以重建为使用MQCONNX,那么如果应用程序无法重建呢?或者应用程序团队不想这样做,或者源代码丢失。不支持MQCONNX的第三方应用程序怎么办?你打算怎么办?
MQ JNDI或CCDT(客户端通道表定义)或新的"MQClient.ini"文件怎么样?你想过如何处理这些实现吗?
您将很容易花费6个月(即1000个小时)来构建一个工作原型,该原型涵盖了我强调的一些问题。你将面临一个充满伤害的世界。我知道,我在那里做过。