micro--go-micro
190 行
4.9 KiB
Markdown
190 行
4.9 KiB
Markdown
# TLS Security Migration Guide
|
|
|
|
## Overview
|
|
|
|
This document provides guidance for migrating to secure TLS certificate verification in go-micro v5.
|
|
|
|
## Current Status (v5)
|
|
|
|
**Default Behavior**: TLS certificate verification is **disabled** by default (`InsecureSkipVerify: true`)
|
|
|
|
**Reason**: Backward compatibility with existing deployments to avoid breaking production systems during routine upgrades.
|
|
|
|
**Security Risk**: The default behavior is vulnerable to man-in-the-middle (MITM) attacks.
|
|
|
|
## Migration Path
|
|
|
|
### Option 1: Enable Secure Mode (RECOMMENDED)
|
|
|
|
Set the environment variable to enable certificate verification:
|
|
|
|
```bash
|
|
export MICRO_TLS_SECURE=true
|
|
```
|
|
|
|
This enables proper TLS certificate verification while maintaining compatibility with v5.
|
|
|
|
### Option 2: Use SecureConfig Directly
|
|
|
|
In your code, explicitly use the secure configuration:
|
|
|
|
```go
|
|
import (
|
|
"go-micro.dev/v5/broker"
|
|
mls "go-micro.dev/v5/util/tls"
|
|
)
|
|
|
|
// Create broker with secure TLS config
|
|
b := broker.NewHttpBroker(
|
|
broker.TLSConfig(mls.SecureConfig()),
|
|
)
|
|
```
|
|
|
|
### Option 3: Provide Custom TLS Configuration
|
|
|
|
For fine-grained control, provide your own TLS configuration:
|
|
|
|
```go
|
|
import (
|
|
"crypto/tls"
|
|
"crypto/x509"
|
|
"go-micro.dev/v5/broker"
|
|
"io/ioutil"
|
|
)
|
|
|
|
// Load CA certificates
|
|
caCert, err := ioutil.ReadFile("/path/to/ca-cert.pem")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
caCertPool := x509.NewCertPool()
|
|
caCertPool.AppendCertsFromPEM(caCert)
|
|
|
|
// Create custom TLS config
|
|
tlsConfig := &tls.Config{
|
|
RootCAs: caCertPool,
|
|
MinVersion: tls.VersionTLS12,
|
|
}
|
|
|
|
// Create broker with custom config
|
|
b := broker.NewHttpBroker(
|
|
broker.TLSConfig(tlsConfig),
|
|
)
|
|
```
|
|
|
|
## Production Deployment Strategy
|
|
|
|
### Rolling Upgrade Considerations
|
|
|
|
The current implementation maintains backward compatibility, allowing safe rolling upgrades:
|
|
|
|
1. **Mixed Version Deployments**: v5 instances can communicate regardless of TLS security settings
|
|
2. **No Immediate Breaking Changes**: Systems continue working with existing behavior
|
|
3. **Gradual Migration**: Enable security incrementally across your infrastructure
|
|
|
|
### Recommended Approach
|
|
|
|
1. **Test in Staging**:
|
|
```bash
|
|
# In staging environment
|
|
export MICRO_TLS_SECURE=true
|
|
```
|
|
|
|
2. **Deploy with Feature Flag**: Use environment-based configuration for gradual rollout
|
|
|
|
3. **Monitor for Issues**: Watch for TLS handshake failures or certificate validation errors
|
|
|
|
4. **Full Production Rollout**: Once validated, enable across all services
|
|
|
|
### Multi-Host/Multi-Process Considerations
|
|
|
|
**Certificate Trust**: When enabling secure mode, ensure:
|
|
|
|
1. All hosts trust the same root CAs
|
|
2. Self-signed certificates are properly distributed if used
|
|
3. Certificate validity periods are monitored
|
|
4. Certificate chains are complete
|
|
|
|
**Service Mesh Alternative**: Consider using a service mesh (Istio, Linkerd, etc.) for:
|
|
- Automatic mTLS between services
|
|
- Certificate management and rotation
|
|
- No application code changes required
|
|
|
|
## Future Changes (v6)
|
|
|
|
In go-micro v6, the default will change to **secure by default**:
|
|
|
|
- `InsecureSkipVerify: false` (certificate verification enabled)
|
|
- Breaking change requiring major version bump
|
|
- Migration completed before v6 release avoids disruption
|
|
|
|
## Testing Your Migration
|
|
|
|
### Verify Secure Mode is Active
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
mls "go-micro.dev/v5/util/tls"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
os.Setenv("MICRO_TLS_SECURE", "true")
|
|
config := mls.Config()
|
|
fmt.Printf("InsecureSkipVerify: %v (should be false)\n", config.InsecureSkipVerify)
|
|
}
|
|
```
|
|
|
|
### Test Certificate Validation
|
|
|
|
Create a test service and verify it:
|
|
- Accepts valid certificates
|
|
- Rejects invalid/self-signed certificates (when not in CA)
|
|
- Properly validates certificate chains
|
|
|
|
## Common Issues and Solutions
|
|
|
|
### Issue: "x509: certificate signed by unknown authority"
|
|
|
|
**Cause**: The server certificate is not signed by a trusted CA
|
|
|
|
**Solution**:
|
|
1. Add the CA certificate to the trusted root CAs
|
|
2. Use a properly signed certificate
|
|
3. For development only: Use `InsecureConfig()` explicitly
|
|
|
|
### Issue: "x509: certificate has expired"
|
|
|
|
**Cause**: Server certificate has expired
|
|
|
|
**Solution**:
|
|
1. Renew the certificate
|
|
2. Implement certificate rotation
|
|
3. Monitor certificate expiry dates
|
|
|
|
### Issue: Services can't communicate after enabling secure mode
|
|
|
|
**Cause**: Mixed certificate authorities or missing certificates
|
|
|
|
**Solution**:
|
|
1. Ensure all services use certificates from the same CA
|
|
2. Distribute CA certificates to all nodes
|
|
3. Verify certificate SANs match service addresses
|
|
|
|
## Questions?
|
|
|
|
For issues or questions about TLS security migration, please:
|
|
- Open an issue on GitHub
|
|
- Check the documentation at https://go-micro.dev/docs/
|
|
- Review the security guidelines
|
|
|
|
## Security Resources
|
|
|
|
- [OWASP TLS Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html)
|
|
- [Go TLS Documentation](https://pkg.go.dev/crypto/tls)
|
|
- [Certificate Best Practices](https://www.ssl.com/guide/ssl-best-practices/)
|