使用BoringCrypto实现Golang程序的FIPS 140-2合规
使用BoringCrypto实现Golang程序的FIPS 140-2合规
我正在努力使我们公司依赖 crypto/tls 进行 HTTP 相关操作的 Go 程序符合 FIPS 140-2 标准。我们正在考虑使用 BoringCrypto,但我想确认一些观察和假设,以确保我们走在正确的道路上。
- 我的理解是,从 Go 1.19 版本开始,我们可以在运行
go build之前设置环境变量BUILD_GOEXPERIMENT=boringcrypto和BUILD_CGO_ENABLED=1,从而从标准的 Go 加密包切换到 BoringCrypto。这是进行切换的正确方法吗? - 我看到一些讨论建议我们的程序需要导入
_ "crypto/tls/fipsonly",以将所有 TLS 配置限制为 FIPS 批准的设置。有人能确认在使用 BoringCrypto 时,为确保 FIPS 140-2 合规性,这一步是否必要吗? - 在我的研究中,我发现 BoringCrypto 的 FIPS 证书下的安全策略(第19页)提供了构建、编译和将 BoringCrypto 模块链接到 BoringSSL 的详细步骤。此外,位于
src/crypto/internal/boring下的 BoringCrypto 的 build.sh 脚本似乎遵循了这些步骤,使用文档中提到的相同工具来编译 BoringSSL 并构建goboringcrypto.syso。因此,我的假设是,对于 Go v1.19 及以上版本,设置BUILD_GOEXPERIMENT=boringcrypto可以确保 Go 程序将使用 BoringCrypto,并静态链接到goboringcrypto.syso,以利用 FIPS 140-2 批准的算法/功能。
有人能确认我的理解是否正确,以及这对于 FIPS 140-2 合规性是否足够吗? 对于以上几点,我非常感谢任何见解或更正。
谢谢
更多关于使用BoringCrypto实现Golang程序的FIPS 140-2合规的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于使用BoringCrypto实现Golang程序的FIPS 140-2合规的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
根据你的问题,以下是针对Go程序使用BoringCrypto实现FIPS 140-2合规的专业解答:
1. 构建环境变量设置
你的理解基本正确。从Go 1.19开始,使用以下环境变量构建程序可以切换到BoringCrypto:
export GOEXPERIMENT=boringcrypto
export CGO_ENABLED=1
go build -o your_program
但需要注意,BUILD_GOEXPERIMENT和BUILD_CGO_ENABLED不是标准环境变量名,正确的变量名是GOEXPERIMENT和CGO_ENABLED。
2. fipsonly包的必要性
是的,导入crypto/tls/fipsonly包是必要的。BoringCrypto只提供了FIPS批准的加密算法实现,但TLS配置可能仍会使用非FIPS批准的参数。fipsonly包会强制TLS使用FIPS批准的配置。
示例代码:
import (
_ "crypto/tls/fipsonly"
"crypto/tls"
"net/http"
)
func main() {
// 现在所有tls.Config都会自动使用FIPS批准的设置
config := &tls.Config{
MinVersion: tls.VersionTLS12,
}
server := &http.Server{
TLSConfig: config,
}
// ... 服务器逻辑
}
3. BoringCrypto的链接和合规性
你的理解是正确的。当设置GOEXPERIMENT=boringcrypto时,Go工具链会:
- 使用
src/crypto/internal/boring/build.sh编译BoringSSL - 生成
goboringcrypto.syso文件 - 静态链接到你的程序中
验证构建是否使用了BoringCrypto的示例:
package main
import (
"crypto/sha256"
"fmt"
"runtime"
)
func main() {
// 检查是否使用BoringCrypto
fmt.Printf("Using BoringCrypto: %v\n", runtime.BoringCrypto)
// FIPS批准的SHA-256示例
h := sha256.New()
h.Write([]byte("test data"))
fmt.Printf("SHA-256: %x\n", h.Sum(nil))
}
完整构建和验证示例
# 设置环境变量
export GOEXPERIMENT=boringcrypto
export CGO_ENABLED=1
# 构建程序
go build -o fips_program main.go
# 验证构建
./fips_program
# 输出应显示: Using BoringCrypto: true
注意事项
- 确保使用Go 1.19或更高版本
- 构建环境需要安装必要的编译工具链
- 最终的可执行文件是静态链接的,不依赖外部BoringSSL库
- 除了加密算法,还需要确保整个系统(包括密钥管理、随机数生成等)符合FIPS要求
这种配置确实为使用FIPS 140-2批准的加密算法提供了基础,但完整的合规性还需要考虑其他因素,如物理安全、操作环境等。

