docs: public ApnsClient build() throws SSLException {
          if (this.apnsServerAddress == null) {
              throw new IllegalStateException("No APNs server address specified.");
          }
  
          if (this.clientCertificate == null && this.privateKey == null && this.signingKey == null) {
              throw new IllegalStateException("No client credentials specified; either TLS credentials (a " +
                      "certificate/private key) or an APNs signing key must be provided before building a client.");
          } else if ((this.clientCertificate != null || this.privateKey != null) && this.signingKey != null) {
              throw new IllegalStateException("Clients may not have both a signing key and TLS credentials.");
          }
  
          final SslContext sslContext;
          {
              final SslProvider sslProvider;
  
              if (OpenSsl.isAvailable()) {
                  log.info("Native SSL provider is available; will use native provider.");
                  sslProvider = SslProvider.OPENSSL_REFCNT;
              } else {
                  log.info("Native SSL provider not available; will use JDK SSL provider.");
                  sslProvider = SslProvider.JDK;
              }
  
              final SslContextBuilder sslContextBuilder = SslContextBuilder.forClient()
                      .sslProvider(sslProvider)
                      .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE);
  
              if (this.clientCertificate != null && this.privateKey != null) {
                  sslContextBuilder.keyManager(this.privateKey, this.privateKeyPassword, this.clientCertificate);
              }
  
              if (this.trustedServerCertificatePemFile != null) {
                  sslContextBuilder.trustManager(this.trustedServerCertificatePemFile);
              } else if (this.trustedServerCertificateInputStream != null) {
                  sslContextBuilder.trustManager(this.trustedServerCertificateInputStream);
              } else if (this.trustedServerCertificates != null) {
                  sslContextBuilder.trustManager(this.trustedServerCertificates);
              }
  
              sslContext = sslContextBuilder.build();
          }
  
          final ApnsClient client = new ApnsClient(this.apnsServerAddress, sslContext, this.signingKey,
                  this.proxyHandlerFactory, this.connectionTimeoutMillis, this.idlePingIntervalMillis,
                  this.gracefulShutdownTimeoutMillis, this.concurrentConnections, this.metricsListener,
                  this.frameLogger, this.eventLoopGroup);
  
          if (sslContext instanceof ReferenceCounted) {
              ((ReferenceCounted) sslContext).release();
          }
  
          return client;
      }