C WMQ安全出口用户ID/PWD传递问题

C WMQ安全出口用户ID/PWD传递问题,c,api,ibm-mq,mq,C,Api,Ibm Mq,Mq,我们目前正在为我们的SVRCONN通道实施安全出口。此出口将向LDAP(AD或UNIX)进行身份验证。我们当前的出口实现仅适用于来自MQ资源管理器的连接 当我们编写代码来连接并传递userID/PWD时,安全出口将获取客户端计算机上的用户帐户登录 下面是一个关于如何连接到MQ的片段 代码: 然后,我们使用此代码检索安全出口上的userID/PWD。 代码: MQ Server->7.1.0.2当有一种便宜的产品可以对LDAP服务器进行身份验证时,你为什么要重新发明轮子?如果您花了一天多的时间编写

我们目前正在为我们的SVRCONN通道实施安全出口。此出口将向LDAP(AD或UNIX)进行身份验证。我们当前的出口实现仅适用于来自MQ资源管理器的连接

当我们编写代码来连接并传递userID/PWD时,安全出口将获取客户端计算机上的用户帐户登录

下面是一个关于如何连接到MQ的片段

代码:

然后,我们使用此代码检索安全出口上的userID/PWD。 代码:


MQ Server->7.1.0.2

当有一种便宜的产品可以对LDAP服务器进行身份验证时,你为什么要重新发明轮子?如果您花了一天多的时间编写此程序,您可以购买MQ Authenticate Security Exit许可证并执行其他操作

MQ仅以明文形式传递密码。如果您熟悉MQ或只使用WireShark,则很容易获取该密码,因为它了解MQ协议

MQ在客户机和服务器之间使用了两种不同的用户ID和密码流动样式:“旧”和“新”样式。不同的平台支持不同的风格。有些直接支持,有些间接支持,有些平台同时进行转换和流(非常奇怪!)

如果您的所有应用程序都可以重新生成以使用MQCONNX,这很好。如果应用程序无法重新生成,该怎么办?或者应用程序团队不想这样做,或者源代码丢失。不支持MQCONNX的第三方应用程序呢?你打算怎么办

mqjndi或CCDT(客户机通道表定义)或新的“MQClient.ini”文件怎么样?您是否考虑过如何处理这些实现


您将轻松地花6个月(即1000小时)构建一个工作原型,涵盖我强调的一些问题。你会受到伤害的。我知道,我已经在那里做过了。

既然有一种便宜的产品可以对LDAP服务器进行身份验证,你为什么要重新发明轮子?如果您花了一天多的时间编写此程序,您可以购买MQ Authenticate Security Exit许可证并执行其他操作

MQ仅以明文形式传递密码。如果您熟悉MQ或只使用WireShark,则很容易获取该密码,因为它了解MQ协议

MQ在客户机和服务器之间使用了两种不同的用户ID和密码流动样式:“旧”和“新”样式。不同的平台支持不同的风格。有些直接支持,有些间接支持,有些平台同时进行转换和流(非常奇怪!)

如果您的所有应用程序都可以重新生成以使用MQCONNX,这很好。如果应用程序无法重新生成,该怎么办?或者应用程序团队不想这样做,或者源代码丢失。不支持MQCONNX的第三方应用程序呢?你打算怎么办

mqjndi或CCDT(客户机通道表定义)或新的“MQClient.ini”文件怎么样?您是否考虑过如何处理这些实现


您将轻松地花6个月(即1000小时)构建一个工作原型,涵盖我强调的一些问题。你会受到伤害的。我知道,我已经在那里做过了。

请使用代码标记代替块引号。删除
并替换为4个空格。@laalto已完成编辑。请使用代码标记而不是块引号。删除
并替换为4个空格。@laalto已完成编辑。
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);
memset (User, 0, pChDef->LongRemoteUserIdLength);
memset (Pass, 0, MQ_PASSWORD_LENGTH); 
MakeCString(User,pChDef->LongRemoteUserIdPtr,pChDef->LongRemoteUserIdLength); 
MakeCString(Pass,pChDef->RemotePassword,MQ_PASSWORD_LENGTH);