Golang招聘:Let's Encrypt招聘初级或高级软件工程师(远程工作)

Golang招聘:Let’s Encrypt招聘初级或高级软件工程师(远程工作) Internet Security Research Group Internet Security Research Group

Let's Encrypt Logo

招聘信息

数十亿人依赖 ISRG / Let’s Encrypt 来运营关键的数字基础设施,以构建一个更安全、更尊重隐私的世界。要承担如此重大的责任,首先要招聘优秀的人才,并为他们提供…

我们致力于让开发者更便捷地使用 HTTPS,我们正在大规模地推进这项工作,并且我们需要您的帮助。我们是首家此类证书颁发机构(CA)。我们向任何人免费提供证书,并提供一个 API 来实现这一目标。这意味着更多的人可以用更少的工作量在其网站上启用 HTTPS。这保护了每个人的网络流量免受窥探,让我们所有人都更加安全。

我们正在寻找一名软件工程师。也许您就是我们要找的人!以下是我们的软件工程团队所负责的工作:

  • 我们维护 Boulder,这是我们运行自动化证书管理环境(ACME)API 的服务器软件。这包括:
    • 诊断和修复错误
    • 发现并解决扩展性问题
    • 开发新功能
  • 我们维护 Pebble,这是 Boulder 的一个“小型”版本,用于帮助开发者测试他们的 ACME 客户端。
  • 我们为我们所依赖的开源项目做出贡献。
  • 我们帮助运营一个社区论坛,协助开发者和最终用户解决问题,并审核评论以确保一切顺利进行。我们很高兴地说,我们的论坛是最友好、最支持 HTTPS 相关讨论的论坛。
  • 我们参与待命轮换,由于我们出色的 SRE 同事,我们很少收到告警,也没有严格的服务级别要求。我们重视保护团队成员免于过度劳累,并根据需要灵活安排工作时间。
  • 我们发展公钥基础设施(PKI)方面的专业知识,并就相关变更向团队其他成员提供建议。
  • 我们参与 IETF 及其他地方的标准制定过程。
  • 我们开发新产品和新功能。例如,目前我们正在规划一个额外安全的、内存安全的递归解析器的工作。
  • 我们与 SRE 团队进行交叉培训,学习他们的一些工具和流程,为决策提供反馈和意见,并就我们开发、由 SRE 部署的工具接收反馈。

我们希望您能为我们的团队带来以下特质:

  • 拥有一年 Go 语言编码经验,或两年其他编译语言的经验。
  • 注重细节,愿意花时间深思熟虑并以正确的方式处理问题。
  • 具备编写单元测试和集成测试的经验。
  • 出色的沟通、组织和优先级排序能力。

不需要具备密码学和 PKI 的先前经验。我们将提供在职培训。

我们的团队是 100% 远程办公的,我们将帮助您完善家庭办公室环境,包括报销网络和电话费用。其他福利包括优质的医疗保险、100% 匹配的 401k 缴款,以及灵活的休假和育儿假政策。

申请请将简历发送至:careers@letsencrypt.org。您将在一周内收到初步回复。


更多关于Golang招聘:Let's Encrypt招聘初级或高级软件工程师(远程工作)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

您好,先生! 希望您一切顺利。

我可以帮助您满足需求。

请通过邮件 luis@cisinlabs.com 或 Skype(账号:live: luis_18439)与我联系。

期待尽快收到您的回复。

此致, Luis

更多关于Golang招聘:Let's Encrypt招聘初级或高级软件工程师(远程工作)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


// 从招聘要求看,这是一个典型的Go语言基础设施开发岗位
// 主要涉及Boulder(ACME服务器)和Pebble(测试工具)的维护开发

// 示例:类似Boulder项目中可能涉及的Go代码结构
package main

import (
    "context"
    "crypto/x509"
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "time"
)

// ACME证书请求结构
type CertificateRequest struct {
    Domain     string    `json:"domain"`
    PublicKey  []byte    `json:"publicKey"`
    ExpiryTime time.Time `json:"expiryTime"`
}

// Boulder风格的证书颁发服务示例
type CertificateAuthority struct {
    storage StorageBackend
    policy  PolicyEngine
}

func (ca *CertificateAuthority) IssueCertificate(ctx context.Context, req *CertificateRequest) (*x509.Certificate, error) {
    // 验证域名所有权
    if err := ca.policy.ValidateDomain(req.Domain); err != nil {
        return nil, fmt.Errorf("domain validation failed: %w", err)
    }
    
    // 创建证书模板
    template := &x509.Certificate{
        SerialNumber: generateSerial(),
        Subject:      pkix.Name{CommonName: req.Domain},
        NotBefore:    time.Now(),
        NotAfter:     req.ExpiryTime,
        DNSNames:     []string{req.Domain},
    }
    
    // 颁发证书
    certDER, err := x509.CreateCertificate(
        rand.Reader,
        template,
        ca.rootCert,
        req.PublicKey,
        ca.privateKey,
    )
    if err != nil {
        return nil, fmt.Errorf("failed to create certificate: %w", err)
    }
    
    // 存储证书记录
    certRecord := &CertificateRecord{
        SerialNumber: template.SerialNumber.String(),
        Domain:       req.Domain,
        IssuedAt:     time.Now(),
        Certificate:  certDER,
    }
    
    if err := ca.storage.StoreCertificate(ctx, certRecord); err != nil {
        return nil, fmt.Errorf("failed to store certificate: %w", err)
    }
    
    return x509.ParseCertificate(certDER)
}

// ACME API端点处理示例
func (ca *CertificateAuthority) HandleACMERequest(w http.ResponseWriter, r *http.Request) {
    var req CertificateRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, "invalid request", http.StatusBadRequest)
        return
    }
    
    cert, err := ca.IssueCertificate(r.Context(), &req)
    if err != nil {
        log.Printf("certificate issuance failed: %v", err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    response := map[string]interface{}{
        "certificate": cert.Raw,
        "serial":      cert.SerialNumber.String(),
        "expires":     cert.NotAfter.Format(time.RFC3339),
    }
    
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

// 单元测试示例(招聘要求中提到需要测试经验)
func TestCertificateIssuance(t *testing.T) {
    ca := &CertificateAuthority{
        storage: mockStorage{},
        policy:  mockPolicy{},
    }
    
    req := &CertificateRequest{
        Domain:     "example.com",
        PublicKey:  testPublicKey,
        ExpiryTime: time.Now().Add(90 * 24 * time.Hour),
    }
    
    cert, err := ca.IssueCertificate(context.Background(), req)
    if err != nil {
        t.Fatalf("expected no error, got %v", err)
    }
    
    if cert.Subject.CommonName != "example.com" {
        t.Errorf("expected CN=example.com, got %s", cert.Subject.CommonName)
    }
    
    if cert.NotAfter.Sub(cert.NotBefore) != 90*24*time.Hour {
        t.Errorf("incorrect certificate validity period")
    }
}

// 并发处理示例(处理大规模证书请求)
func (ca *CertificateAuthority) ProcessBatchRequests(ctx context.Context, requests []CertificateRequest) []CertificateResult {
    results := make([]CertificateResult, len(requests))
    var wg sync.WaitGroup
    
    for i, req := range requests {
        wg.Add(1)
        go func(idx int, req CertificateRequest) {
            defer wg.Done()
            
            cert, err := ca.IssueCertificate(ctx, &req)
            results[idx] = CertificateResult{
                Certificate: cert,
                Error:       err,
            }
        }(i, req)
    }
    
    wg.Wait()
    return results
}

// 内存安全解析器示例(招聘中提到正在开发的项目)
type SafeDNSResolver struct {
    cache   *sync.Map
    timeout time.Duration
}

func (r *SafeDNSResolver) Resolve(ctx context.Context, domain string) ([]net.IP, error) {
    // 使用内存安全的方式处理DNS解析
    if cached, ok := r.cache.Load(domain); ok {
        return cached.([]net.IP), nil
    }
    
    ctx, cancel := context.WithTimeout(ctx, r.timeout)
    defer cancel()
    
    ips, err := net.DefaultResolver.LookupIPAddr(ctx, domain)
    if err != nil {
        return nil, err
    }
    
    result := make([]net.IP, len(ips))
    for i, ip := range ips {
        result[i] = ip.IP
    }
    
    r.cache.Store(domain, result)
    return result, nil
}

func main() {
    // 启动ACME服务器
    ca := &CertificateAuthority{
        storage: NewPostgresStorage(),
        policy:  NewDomainPolicy(),
    }
    
    mux := http.NewServeMux()
    mux.HandleFunc("/acme/new-cert", ca.HandleACMERequest)
    mux.HandleFunc("/acme/revoke", ca.HandleRevocationRequest)
    
    server := &http.Server{
        Addr:         ":8080",
        Handler:      mux,
        ReadTimeout:  10 * time.Second,
        WriteTimeout: 30 * time.Second,
    }
    
    log.Println("Starting ACME server on :8080")
    if err := server.ListenAndServe(); err != nil {
        log.Fatal(err)
    }
}

这个岗位需要处理:

  1. 并发处理 - 大规模证书颁发需要高效的goroutine管理
  2. 密码学操作 - 使用crypto/x509等标准库
  3. API设计 - 实现ACME协议端点
  4. 测试驱动 - 单元测试和集成测试
  5. 内存安全 - 避免内存泄漏和安全漏洞

技术栈包括:Go标准库、HTTP服务器、数据库交互、密码学操作、测试框架。代码需要注重错误处理、资源管理和性能优化。

回到顶部