「go-zero 系列」gRPC SSL/TLS 单向认证

本文详细介绍了在Go 1.16中如何生成CA证书、私钥和服务器证书,包括openssl工具的使用步骤,以及注意事项。重点在于Ubuntu 16.04下openssl.cnf文件的配置。

💬

生活总是这样。

💻

最近在看 grpc tls 认证,发现使用 go1.16 版本证书的生成相较之前会麻烦挺多,证书生成参考

# 生成 ca 证书密钥
ronething at ronething-dell-ubuntu in ~/Documents/grpc-sample/tls
$ openssl genrsa -out ca.key 2048
# 生成 ca 证书公钥
ronething at ronething-dell-ubuntu in ~/Documents/grpc-sample/tls 
$ openssl req -new -x509 -days 3650 -key ca.key -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GZ       
Locality Name (eg,
<think>我们面对的问题是:Maven编译过程中,由于protobuf和gRPC生成的Java代码存在语法错误而导致编译失败。 根据用户描述,错误信息中提到了"protoc did not exit cleanly",但用户现在明确说明是生成的Java代码有语法错误。 可能的原因: 1. 使用的protoc版本与protobuf-java或grpc-java版本不兼容。 2. proto文件本身存在错误,导致生成的代码有问题。 3. 生成代码的目标Java版本与当前项目使用的Java版本不兼容(例如生成了Java 11的代码,但项目使用Java 8)。 4. 生成代码的过程中出现异常(如内存不足)导致部分代码生成失败。 解决方案: 步骤1:检查版本兼容性 确保protoc编译器版本、protobuf-java库版本、grpc-java库版本以及protobuf-maven-plugin版本相互兼容。 例如,参考官方文档的版本对应关系: - protobuf-java和protoc版本必须一致(如都是3.21.12) - grpc-java版本需要与protobuf-java版本匹配(例如grpc-java 1.50.0对应protobuf-java 3.21.9) 步骤2:检查proto文件 使用protoc命令行单独编译proto文件,查看生成的Java代码是否有语法错误。 例如: ```bash protoc -I=src/main/proto --java_out=src/main/java src/main/proto/your_service.proto ``` 如果生成的代码有语法错误,可能是proto文件中有不正确的语法,或者使用了不正确的选项。 步骤3:指定Java版本 在protobuf-maven-plugin配置中指定目标Java版本,确保生成的代码与项目Java版本兼容。 在pom.xml中配置: ```xml <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.21.12:exe:${os.detected.classifier}</protocArtifact> <!-- 指定生成Java代码的版本 --> <additionalProtoPathElements> <additionalProtoPathElement>${project.basedir}/src/main/proto</additionalProtoPathElement> </additionalProtoPathElements> <outputDirectory>${project.basedir}/src/main/java</outputDirectory> <!-- 设置生成代码的Java版本 --> <javaTarget>8</javaTarget> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> <!-- 如果使用gRPC,需要这个目标 --> </goals> </execution> </executions> </plugin> ``` 步骤4:增加Maven内存 如果生成代码过程中内存不足,可能导致生成代码不完整。参考引用[2],在Maven运行配置中增加内存: - 在IDEA中:File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven -> Runner 在VM Options中加入:`-Xms512m -Xmx1024m` - 命令行中:设置环境变量 `MAVEN_OPTS=-Xms512m -Xmx1024m` 步骤5:清理并重新生成 清理之前生成的代码,然后重新编译: ```bash mvn clean compile ``` 步骤6:检查生成的代码 如果上述步骤后问题依旧,检查生成的Java代码,定位具体的语法错误位置。可能的原因包括: - 生成了重复的方法(可能是proto文件中重复定义了消息) - 生成了不支持的语法(如Java 8不支持lambda,但生成的代码中使用了lambda?这通常不会发生,因为protoc生成的是兼容低版本的代码) 步骤7:检查依赖冲突 使用`mvn dependency:tree`查看是否有多个不同版本的protobuf-java库,导致在编译时使用了错误的版本。 步骤8:更新插件版本 尝试使用最新版本的protobuf-maven-plugin(如0.6.1)和最新且兼容的protobuf版本。 步骤9:检查IDE设置 如果是在IDE中编译失败,但命令行可以,可能是IDE的配置问题。参考引用[3],检查: - JDK版本是否一致(项目设置、Maven编译器的JDK版本) - 清理IDE缓存:File -> Invalidate Caches / Restart... 步骤10:查看完整错误日志 使用`mvn compile -e`或`mvn compile -X`查看详细错误信息,定位具体是哪个文件、哪一行代码出错。 示例:如果错误信息显示“illegal start of type”,可能是生成的代码中出现了重复的嵌套类,这通常是因为proto文件中定义了重复的嵌套消息。 如果以上步骤无法解决,请提供具体的错误日志片段。 §§相关问题§§ 1. 如何解决protobuf版本冲突? 2. 如何配置protobuf-maven-plugin以支持gRPC代码生成? 3. 如何在不同操作系统上配置protoc路径? 4. 如何解决proto文件导入路径问题?</think>### 解决 Maven 编译中 Protobuf/gRPC 生成的 Java 代码语法错误问题 当 Protobuf/gRPC 生成的 Java 代码出现语法错误导致编译失败时,通常是版本兼容性或生成过程异常导致的。以下是系统性的解决方案: --- ### 1. **检查版本兼容性(核心问题)** - **Protoc ↔ Protobuf-Java ↔ gRPC 版本匹配** 版本不匹配是语法错误的主要原因。使用官方兼容矩阵: ```xml <!-- pom.xml 示例配置 --> <properties> <!-- 确保三者版本兼容(示例为2023年兼容组合) --> <protobuf.version>3.22.0</protobuf.version> <grpc.version>1.54.0</grpc.version> </properties> <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-all</artifactId> <version>${grpc.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <!-- 关键:protoc 版本必须与 protobuf-java 一致 --> <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact> </configuration> </plugin> </plugins> </build> ``` [官方兼容性参考](https://github.com/grpc/grpc-java#download) - **验证工具版本一致性** 在终端执行: ```bash mvn protobuf:compile --version # 输出应包含: # protoc version: 3.22.0 (与pom中一致) ``` --- ### 2. **清理并重新生成代码** - **删除旧生成文件** 手动删除以下目录(避免残留错误代码): ``` target/generated-sources/protobuf target/generated-sources/grpc-java ``` - **强制重新生成** 执行完整重建: ```bash mvn clean compile -U ``` --- ### 3. **检查 Java 版本兼容性** - **JDK 版本匹配** Protobuf 生成的代码需要与项目 JDK 版本兼容: ```xml <!-- pom.xml 中指定Java版本 --> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> ``` 验证 IDEA 设置:`File > Project Structure > Project SDK/Language Level`[^3] --- ### 4. **增加生成过程内存** 代码生成时内存不足会导致文件损坏: - **IDEA 配置** `File > Settings > Build Tools > Maven > Runner` 在 `VM Options` 添加: ``` -Xms512m -Xmx2048m -XX:MaxPermSize=1024m ``` [^2] - **命令行执行** ```bash export MAVEN_OPTS="-Xmx2g" && mvn clean compile ``` --- ### 5. **检查 Proto 文件合法性** 使用 `protoc` 命令行测试: ```bash # 示例:检查语法错误 protoc -I=src/main/proto \ --java_out=out \ src/main/proto/your_service.proto # 检查输出目录中的Java文件 find out -name "*.java" | xargs javac -d /tmp ``` 若发现语法错误,检查 proto 文件中是否使用了实验性特性(如 `optional` 在 proto3 中的非常规用法)。 --- ### 6. **依赖冲突排查** 检查是否存在多个 protobuf 版本: ```bash mvn dependency:tree -Dincludes=com.google.protobuf:* ``` 若存在冲突,在冲突依赖中添加 `<exclusion>`: ```xml <dependency> <groupId>problematic.group</groupId> <artifactId>problematic-artifact</artifactId> <exclusions> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 7. **验证生成代码** 如果仍失败,检查生成的 Java 文件: 1. 在 `target/generated-sources/protobuf` 找到问题文件 2. 查看错误行号(如 `error: illegal start of type`) 3. 常见问题: - 嵌套类重复定义 → proto 文件消息命名冲突 - 泛型语法错误 → JDK 版本不兼容 - 方法签名错误 → protoc 版本异常 --- ### 典型错误解决流程 ```mermaid graph TD A[编译失败] --> B{检查错误日志} B -->|语法错误| C[清理生成目录] C --> D[验证版本兼容性] D --> E[增加内存重试] E -->|仍失败| F[命令行单独生成] F --> G[分析具体错误行] G --> H[修正proto文件或版本] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值