|
42 | 42 | import com.google.api.gax.rpc.TransportChannel;
|
43 | 43 | import com.google.api.gax.rpc.TransportChannelProvider;
|
44 | 44 | import com.google.api.gax.rpc.internal.EnvironmentProvider;
|
45 |
| -import com.google.api.gax.rpc.mtls.MtlsProvider; |
| 45 | +import com.google.api.gax.rpc.mtls.CertificateBasedAccess; |
46 | 46 | import com.google.auth.ApiKeyCredentials;
|
47 | 47 | import com.google.auth.Credentials;
|
| 48 | +import com.google.auth.mtls.CertificateSourceUnavailableException; |
| 49 | +import com.google.auth.mtls.DefaultMtlsProviderFactory; |
| 50 | +import com.google.auth.mtls.MtlsProvider; |
48 | 51 | import com.google.auth.oauth2.ComputeEngineCredentials;
|
49 | 52 | import com.google.auth.oauth2.SecureSessionAgent;
|
50 | 53 | import com.google.auth.oauth2.SecureSessionAgentConfig;
|
@@ -150,6 +153,7 @@ public final class InstantiatingGrpcChannelProvider implements TransportChannelP
|
150 | 153 | @Nullable private final Boolean allowNonDefaultServiceAccount;
|
151 | 154 | @VisibleForTesting final ImmutableMap<String, ?> directPathServiceConfig;
|
152 | 155 | @Nullable private final MtlsProvider mtlsProvider;
|
| 156 | + private final CertificateBasedAccess certificateBasedAccess; |
153 | 157 | @Nullable private final SecureSessionAgent s2aConfigProvider;
|
154 | 158 | private final List<HardBoundTokenTypes> allowedHardBoundTokenTypes;
|
155 | 159 | @VisibleForTesting final Map<String, String> headersWithDuplicatesRemoved = new HashMap<>();
|
@@ -183,6 +187,7 @@ private InstantiatingGrpcChannelProvider(Builder builder) {
|
183 | 187 | this.mtlsEndpoint = builder.mtlsEndpoint;
|
184 | 188 | this.allowedHardBoundTokenTypes = builder.allowedHardBoundTokenTypes;
|
185 | 189 | this.mtlsProvider = builder.mtlsProvider;
|
| 190 | + this.certificateBasedAccess = builder.certificateBasedAccess; |
186 | 191 | this.s2aConfigProvider = builder.s2aConfigProvider;
|
187 | 192 | this.envProvider = builder.envProvider;
|
188 | 193 | this.interceptorProvider = builder.interceptorProvider;
|
@@ -484,7 +489,10 @@ boolean canUseDirectPathWithUniverseDomain() {
|
484 | 489 |
|
485 | 490 | @VisibleForTesting
|
486 | 491 | ChannelCredentials createMtlsChannelCredentials() throws IOException, GeneralSecurityException {
|
487 |
| - if (mtlsProvider.useMtlsClientCertificate()) { |
| 492 | + if (mtlsProvider == null) { |
| 493 | + return null; |
| 494 | + } |
| 495 | + if (certificateBasedAccess.useMtlsClientCertificate()) { |
488 | 496 | KeyStore mtlsKeyStore = mtlsProvider.getKeyStore();
|
489 | 497 | if (mtlsKeyStore != null) {
|
490 | 498 | KeyManagerFactory factory =
|
@@ -853,7 +861,8 @@ public static final class Builder {
|
853 | 861 | private boolean useS2A;
|
854 | 862 | private EnvironmentProvider envProvider;
|
855 | 863 | private SecureSessionAgent s2aConfigProvider = SecureSessionAgent.create();
|
856 |
| - private MtlsProvider mtlsProvider = new MtlsProvider(); |
| 864 | + @Nullable private MtlsProvider mtlsProvider; |
| 865 | + private CertificateBasedAccess certificateBasedAccess; |
857 | 866 | @Nullable private GrpcInterceptorProvider interceptorProvider;
|
858 | 867 | @Nullable private Integer maxInboundMessageSize;
|
859 | 868 | @Nullable private Integer maxInboundMetadataSize;
|
@@ -904,6 +913,7 @@ private Builder(InstantiatingGrpcChannelProvider provider) {
|
904 | 913 | this.allowedHardBoundTokenTypes = provider.allowedHardBoundTokenTypes;
|
905 | 914 | this.directPathServiceConfig = provider.directPathServiceConfig;
|
906 | 915 | this.mtlsProvider = provider.mtlsProvider;
|
| 916 | + this.certificateBasedAccess = provider.certificateBasedAccess; |
907 | 917 | this.s2aConfigProvider = provider.s2aConfigProvider;
|
908 | 918 | }
|
909 | 919 |
|
@@ -994,6 +1004,12 @@ Builder setMtlsProvider(MtlsProvider mtlsProvider) {
|
994 | 1004 | return this;
|
995 | 1005 | }
|
996 | 1006 |
|
| 1007 | + @VisibleForTesting |
| 1008 | + Builder setCertificateBasedAccess(CertificateBasedAccess certificateBasedAccess) { |
| 1009 | + this.certificateBasedAccess = certificateBasedAccess; |
| 1010 | + return this; |
| 1011 | + } |
| 1012 | + |
997 | 1013 | @VisibleForTesting
|
998 | 1014 | Builder setS2AConfigProvider(SecureSessionAgent s2aConfigProvider) {
|
999 | 1015 | this.s2aConfigProvider = s2aConfigProvider;
|
@@ -1269,6 +1285,25 @@ CallCredentials createHardBoundTokensCallCredentials(
|
1269 | 1285 | }
|
1270 | 1286 |
|
1271 | 1287 | public InstantiatingGrpcChannelProvider build() {
|
| 1288 | + if (certificateBasedAccess == null) { |
| 1289 | + certificateBasedAccess = CertificateBasedAccess.createWithSystemEnv(); |
| 1290 | + } |
| 1291 | + if (certificateBasedAccess.useMtlsClientCertificate()) { |
| 1292 | + if (mtlsProvider == null) { |
| 1293 | + // Attempt to create default MtlsProvider from environment. |
| 1294 | + try { |
| 1295 | + mtlsProvider = DefaultMtlsProviderFactory.create(); |
| 1296 | + } catch (CertificateSourceUnavailableException e) { |
| 1297 | + // This is okay. Leave mtlsProvider as null so that we will not auto-upgrade |
| 1298 | + // to mTLS endpoints. See https://google.aip.dev/auth/4114. |
| 1299 | + } catch (IOException e) { |
| 1300 | + LOG.log( |
| 1301 | + Level.WARNING, |
| 1302 | + "DefaultMtlsProviderFactory encountered unexpected IOException: " + e.getMessage()); |
| 1303 | + } |
| 1304 | + } |
| 1305 | + } |
| 1306 | + |
1272 | 1307 | if (isMtlsS2AHardBoundTokensEnabled()) {
|
1273 | 1308 | // Set a {@code ComputeEngineCredentials} instance to be per-RPC call credentials,
|
1274 | 1309 | // which will be used to fetch MTLS_S2A hard bound tokens from the metdata server.
|
|
0 commit comments