尝试使用TLS' LDAP结果代码201" ErrorNetwork":连接到LDAP时出错:无效的数据包格式'

时间:2015-02-17 10:27:25

标签: ssl go ldap

我尝试使用http://www.github.com/mavricknz/ldap使用LDAP和TLS进行身份验证服务 当我使用以下代码仅使用基本身份验证时,一切正常。

conn := ldap.NewLDAPConnection(ldapHost, ldapPort)

conn.NetworkConnectTimeout = time.Duration(ldapConnTimeout) * time.Millisecond
conn.ReadTimeout = time.Duration(ldapReadTimeout) * time.Millisecond

if err := conn.Connect(); err != nil {
    log.Println(err)
    resp.WriteHeader(http.StatusInternalServerError)
    return
}

defer conn.Close()

// bind to ldap
if err := conn.Bind(username, password); err != nil {
    ldaperr := err.(*ldap.LDAPError)
    if ldaperr.ResultCode == ldap.LDAPResultInvalidCredentials {
        resp.Header().Set("WWW-Authenticate", `Basic realm="Item Codes Database"`)
        resp.WriteHeader(http.StatusUnauthorized)
    } else {
        log.Println(err)
        resp.WriteHeader(http.StatusInternalServerError)
    }
    return
}

但是当我尝试通过更改

将TLS应用于我的代码时
conn := ldap.NewLDAPConnection(ldapHost, ldapPort)

ldap.NewLDAPTLSConnection(ldapHost, ldapPort, &tls.Config{})

它给了我一个错误LDAP Result Code 201 "ErrorNetwork": Invalid packet format。该错误来自方法conn.Connect(),当我深入研究它时,它甚至没有达到使用TLS配置或TLS标志的程度。

1 个答案:

答案 0 :(得分:0)

好的,我找到了我的解决方案。我需要将端口从ldap的389改为ldaps' 636因为我们使用TLS协议。我还必须使用方法NewLDAPSSLConnection来建立隐式TLS连接。

我不确定为什么NewLDAPTSLConnection不起作用。它使用显式TLS,它要求我们首先建立正常连接(使用端口389),然后尝试通过该连接启动TLS。