googleapis / googleapis/google-cloud-python

[google-auth] Feat: ECP and hardware-backed cert support for X.509 workloads

Abierto
#17,967 1 comentario 0 reacciones 1 asignado Reclamado por @attharva-24 Ver en GitHub
auth priority: p3 type: feature request
Lenguaje dominante
Python
Estrellas
5.4k
Forks
1.8k
Merge medio
3 d 4 h
PR fusionados (30 d)
122

Descripción

### Determine this is the right repository

- [x] I determined this is the correct repository in which to report this feature request.

### Summary of the feature request

I would like to use my hardware-backed (TPM, Secure Enclave, HSM, etc) certificates with a X.509 Workload Identity Provider.

Today google-auth X.509 provider assumes it will be given the private key of the certificate and hard fails if it doesn't:

[packages/google-auth/google/auth/external_account.py](https://github.com/googleapis/google-cloud-python/blob/main/packages/google-auth/google/auth/external_account.py#L480-L484) line 480:
```python
# Inject client certificate into request.
if self._mtls_required():
request = functools.partial(
request, cert=self._get_mtls_cert_and_key_paths()
)
```

this limits the implementation to only private keys stored directly on the filesystem.

Allowing hardware-backed certificates provides iron-clad security for service account authentication. The library will be able to authenticate as a WIF Identity / Service account using a private key that was generated on the TPM / Secure Enclave and cannot be exported.

### Desired code experience

```python
from google.auth import default
from google.auth.transport.requests import AuthorizedSession

# certificate_config.json has ECP libs + macos_keychain (hardware-backed key)
# but NO "workload" section (no private key file on disk)

creds, _ = default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
session = AuthorizedSession(creds)
session.configure_mtls_channel() # ECP handles mTLS via hardware signing
response = session.get("https://cloudresourcemanager.googleapis.com/v1/projects/my-project")
```

### Expected results

`_get_cert_bytes()` should fall back to the [ECP signer library](https://github.com/googleapis/enterprise-certificate-proxy) `(GetCertPemForPython)` to retrieve the certificate from the OS keystore when no workload file path exists. `_perform_refresh_token()` should skip injecting `cert=(cert_path, key_path)` when paths are `(None, None)`, letting the session's ECP adapter (via `configure_mtls_channel())` handle mTLS. Currently it crashes with `TypeError` (None path) or `SSLError: [SSL] PEM lib`s (placeholder path).

### API client name and version

google-auth 2.56.2

### Use case

This feature would be useful in allowing non-GCP service account / WIF authenticating while never needing to expose a private key for export and theft.

### Additional context

I'm glad to discuss further internally next week. go/teams/jayhlee.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.