diff --git a/checks/spotbugs-exclude.xml b/checks/spotbugs-exclude.xml
index e5e6a79..1d7554e 100644
--- a/checks/spotbugs-exclude.xml
+++ b/checks/spotbugs-exclude.xml
@@ -24,6 +24,9 @@
+
+
+
diff --git a/scram-client/src/main/java/com/ongres/scram/client/ScramClient.java b/scram-client/src/main/java/com/ongres/scram/client/ScramClient.java
index 6b6814d..c965502 100644
--- a/scram-client/src/main/java/com/ongres/scram/client/ScramClient.java
+++ b/scram-client/src/main/java/com/ongres/scram/client/ScramClient.java
@@ -376,12 +376,13 @@ public interface FinalBuildStage {
* supply a binding type or data this builder does not compute itself, such as
* {@code tls-exporter} from a non-JDK TLS stack.
*
- * @param serverCertificate the server's end-entity (leaf) TLS certificate to bind to
+ * @param serverCertificate the server's end-entity (leaf) TLS certificate to bind to,
+ * or {@code null} to configure no binding
* @return {@code this} builder for use in a chained invocation
* @see #channelBinding(String, byte[])
* @see ChannelBindingPolicy
*/
- FinalBuildStage channelBinding(@NotNull X509Certificate serverCertificate);
+ FinalBuildStage channelBinding(@Nullable X509Certificate serverCertificate);
/**
* Sets the StringPreparation, is recommended to leave the default SASL_PREPARATION.
@@ -501,14 +502,17 @@ public FinalBuildStage channelBindingPolicy(@NotNull ChannelBindingPolicy policy
}
@Override
- public FinalBuildStage channelBinding(@NotNull X509Certificate serverCertificate) {
+ public FinalBuildStage channelBinding(@Nullable X509Certificate serverCertificate) {
+ if (serverCertificate == null) {
+ return this;
+ }
if (cbindConfigured) {
throw new IllegalStateException(
"channelBinding(X509Certificate) called but channel binding was already configured "
+ "via channelBinding(String, byte[])");
}
cbindConfigured = true;
- this.serverCertificate = checkNotNull(serverCertificate, "serverCertificate");
+ this.serverCertificate = serverCertificate;
return this;
}
diff --git a/scram-client/src/test/java/com/example/ChannelBindingNegotiationTest.java b/scram-client/src/test/java/com/example/ChannelBindingNegotiationTest.java
index b3ad217..65e4b5b 100644
--- a/scram-client/src/test/java/com/example/ChannelBindingNegotiationTest.java
+++ b/scram-client/src/test/java/com/example/ChannelBindingNegotiationTest.java
@@ -253,6 +253,16 @@ void policyRequire_DualSet_ThrowsException() {
+ "was already configured via channelBinding(String, byte[])", ex2.getMessage());
}
+ @Test
+ @DisplayName("Allows null channel binding certificate")
+ void policyRequire_DualSet_NullCertificate() {
+ assertDoesNotThrow(
+ () -> createBaseBuilder(BARE_AND_PLUS)
+ .channelBinding(null)
+ .channelBinding(null, null)
+ .build());
+ }
+
@Test
@DisplayName("REQUIRE: Aborts initialization if the server fails to advertise a -PLUS mechanism")
void policyRequire_ServerLacksPlus_ThrowsException() {