@@ -164,6 +164,24 @@ func randomString(length int) string {
164164 return fmt .Sprintf ("%x" , buf )[:length ]
165165}
166166
167+ func setupSaslMechanism (auth authConfig , saramaCfg * sarama.Config ) (error ) {
168+ switch strings .ToLower (auth .SASLMechanism ) {
169+ case "plain" , "" :
170+ saramaCfg .Net .SASL .Mechanism = sarama .SASLMechanism (sarama .SASLTypePlaintext )
171+ return nil
172+ case "scram-sha512" :
173+ saramaCfg .Net .SASL .SCRAMClientGeneratorFunc = func () sarama.SCRAMClient { return & XDGSCRAMClient {HashGeneratorFcn : SHA512 } }
174+ saramaCfg .Net .SASL .Mechanism = sarama .SASLMechanism (sarama .SASLTypeSCRAMSHA512 )
175+ return nil
176+ case "scram-sha256" :
177+ saramaCfg .Net .SASL .SCRAMClientGeneratorFunc = func () sarama.SCRAMClient { return & XDGSCRAMClient {HashGeneratorFcn : SHA256 } }
178+ saramaCfg .Net .SASL .Mechanism = sarama .SASLMechanism (sarama .SASLTypeSCRAMSHA256 )
179+ return nil
180+ default :
181+ return fmt .Errorf ("Unsupported auth sasl mechanism: %#v" , auth .SASLMechanism )
182+ }
183+ }
184+
167185// setupCerts takes the paths to a tls certificate, CA, and certificate key in
168186// a PEM format and returns a constructed tls.Config object.
169187func setupCerts (certPath , caPath , keyPath string ) (* tls.Config , error ) {
@@ -207,6 +225,8 @@ type authConfig struct {
207225 ClientCertKey string `json:"client-certificate-key"`
208226 SASLPlainUser string `json:"sasl_plain_user"`
209227 SASLPlainPassword string `json:"sasl_plain_password"`
228+ SASLMechanism string `json:"sasl_mechanism"`
229+ SecurityProtocol string `json:"security_protocol"`
210230}
211231
212232func setupAuth (auth authConfig , saramaCfg * sarama.Config ) error {
@@ -218,7 +238,7 @@ func setupAuth(auth authConfig, saramaCfg *sarama.Config) error {
218238 case "TLS" :
219239 return setupAuthTLS (auth , saramaCfg )
220240 case "TLS-1way" :
221- return setupAuthTLS1Way (auth , saramaCfg )
241+ return setupAuthTLS (auth , saramaCfg )
222242 case "SASL" :
223243 return setupSASL (auth , saramaCfg )
224244 default :
@@ -230,38 +250,24 @@ func setupSASL(auth authConfig, saramaCfg *sarama.Config) error {
230250 saramaCfg .Net .SASL .Enable = true
231251 saramaCfg .Net .SASL .User = auth .SASLPlainUser
232252 saramaCfg .Net .SASL .Password = auth .SASLPlainPassword
233- return nil
234- }
253+ err := setupSaslMechanism (auth , saramaCfg )
235254
236- func setupAuthTLS1Way (auth authConfig , saramaCfg * sarama.Config ) error {
237- saramaCfg .Net .TLS .Enable = true
238- saramaCfg .Net .TLS .Config = & tls.Config {}
239-
240- if auth .CACert == "" {
241- return nil
242- }
243-
244- caString , err := os .ReadFile (auth .CACert )
245255 if err != nil {
246- return fmt . Errorf ( "failed to read ca-certificate err=%v" , err )
256+ return err ;
247257 }
248258
249- caPool := x509 .NewCertPool ()
250- ok := caPool .AppendCertsFromPEM (caString )
251- if ! ok {
252- failf ("unable to add ca-certificate at %s to certificate pool" , auth .CACert )
259+ if (strings .EqualFold (auth .SecurityProtocol , "SASL_SSL" )) {
260+ return setupAuthTLS (auth , saramaCfg )
253261 }
254-
255- tlsCfg := & tls.Config {RootCAs : caPool }
256- tlsCfg .BuildNameToCertificate ()
257-
258- saramaCfg .Net .TLS .Config = tlsCfg
259262 return nil
260263}
261264
262265func setupAuthTLS (auth authConfig , saramaCfg * sarama.Config ) error {
263- if auth .CACert == "" || auth .ClientCert == "" || auth .ClientCertKey == "" {
264- return fmt .Errorf ("client-certificate, client-certificate-key and ca-certificate are required - got auth=%#v" , auth )
266+ saramaCfg .Net .TLS .Enable = true
267+ saramaCfg .Net .TLS .Config = & tls.Config {}
268+
269+ if auth .CACert == "" {
270+ return nil
265271 }
266272
267273 caString , err := os .ReadFile (auth .CACert )
@@ -275,17 +281,20 @@ func setupAuthTLS(auth authConfig, saramaCfg *sarama.Config) error {
275281 failf ("unable to add ca-certificate at %s to certificate pool" , auth .CACert )
276282 }
277283
278- clientCert , err := tls .LoadX509KeyPair (auth .ClientCert , auth .ClientCertKey )
279- if err != nil {
280- return err
281- }
284+ var tlsCfg * tls.Config
285+ if auth .ClientCert != "" && auth .ClientCertKey != "" {
286+ clientCert , err := tls .LoadX509KeyPair (auth .ClientCert , auth .ClientCertKey )
287+ if err != nil {
288+ return err
289+ }
290+ tlsCfg = & tls.Config {RootCAs : caPool , Certificates : []tls.Certificate {clientCert }}
291+ } else {
292+ tlsCfg = & tls.Config {RootCAs : caPool }
282293
283- tlsCfg := & tls. Config { RootCAs : caPool , Certificates : []tls. Certificate { clientCert } }
294+ }
284295 tlsCfg .BuildNameToCertificate ()
285296
286- saramaCfg .Net .TLS .Enable = true
287297 saramaCfg .Net .TLS .Config = tlsCfg
288-
289298 return nil
290299}
291300
0 commit comments