使用BoringCrypto实现Golang程序的FIPS 140-2合规

使用BoringCrypto实现Golang程序的FIPS 140-2合规 我正在努力使我们公司依赖 crypto/tls 进行 HTTP 相关操作的 Go 程序符合 FIPS 140-2 标准。我们正在考虑使用 BoringCrypto,但我想确认一些观察和假设,以确保我们走在正确的道路上。

  1. 我的理解是,从 Go 1.19 版本开始,我们可以在运行 go build 之前设置环境变量 BUILD_GOEXPERIMENT=boringcryptoBUILD_CGO_ENABLED=1,从而从标准的 Go 加密包切换到 BoringCrypto。这是进行切换的正确方法吗?
  2. 我看到一些讨论建议我们的程序需要导入 _ "crypto/tls/fipsonly",以将所有 TLS 配置限制为 FIPS 批准的设置。有人能确认在使用 BoringCrypto 时,为确保 FIPS 140-2 合规性,这一步是否必要吗?
  3. 在我的研究中,我发现 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

1 回复

更多关于使用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_GOEXPERIMENTBUILD_CGO_ENABLED不是标准环境变量名,正确的变量名是GOEXPERIMENTCGO_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

注意事项

  1. 确保使用Go 1.19或更高版本
  2. 构建环境需要安装必要的编译工具链
  3. 最终的可执行文件是静态链接的,不依赖外部BoringSSL库
  4. 除了加密算法,还需要确保整个系统(包括密钥管理、随机数生成等)符合FIPS要求

这种配置确实为使用FIPS 140-2批准的加密算法提供了基础,但完整的合规性还需要考虑其他因素,如物理安全、操作环境等。

回到顶部