> 现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的
> 所以本系列着重介绍 grpc 开发时可以能会用到的一些配置
## 不使用任何加密
客户端创建连接的时候默认必须使用加密传输,否则会直接报错
```bash
2020/04/28 15:59:53 did not connect: grpc: no transport security set (use grpc.WithInsecure() explicitly or set credentials)
exit status 1
```
**禁用安全传输**
```go
// client
conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
```
## 开启 TLS/SSL 加密
TLS 是一种常见的端对端安全传输协议
grpc 可以使用 [credentials.TransportCredentials](https://godoc.org/google.golang.org/grpc/credentials#TransportCredentials) 结构来方便的开启安全传输
### 服务端
使用 `credentials.NewServerTLSFromFile` 生成 `credentials.TransportCredentials`
调用 `grpc.NewServer` 时传递 [grpc.Creds](https://godoc.org/google.golang.org/grpc#Creds)
```go
creds, err := credentials.NewServerTLSFromFile(certFile, keyFile)
if err != nil {
log.Fatalf("Failed to generate credentials %v", err)
}
lis, err := net.Listen("tcp", ":0")
server := grpc.NewServer(grpc.Creds(creds))
// ignore Serve error
server.Serve(lis)
```
### 客户端
生成 `credentials.TransportCredentials`
```go
// serverNameOverride 用于测试, 通常为 "" 空字符串
func NewClientTLSFromCert(cp *x509.CertPool, serverNameOverride string) TransportCredentials
func NewClientTLSFromFile(certFile, serverNameOverride string) (TransportCredentials, error)
```
调用 `grpc.Dial` 时传递 `grpc.WithTransportCredentials`
```go
creds, _ := credentials.NewClientTLSFromFile(certFile, "")
conn, _ := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))
```
grpc 开发进阶 - 加密传输