21个版本

0.7.2 2024年7月5日
0.7.0 2024年1月9日
0.6.4 2023年3月30日
0.6.3 2022年7月12日
0.4.0 2020年3月23日

#42认证

Download history 931/week @ 2024-05-04 693/week @ 2024-05-11 1109/week @ 2024-05-18 446/week @ 2024-05-25 630/week @ 2024-06-01 1231/week @ 2024-06-08 627/week @ 2024-06-15 536/week @ 2024-06-22 505/week @ 2024-06-29 746/week @ 2024-07-06 892/week @ 2024-07-13 913/week @ 2024-07-20 630/week @ 2024-07-27 558/week @ 2024-08-03 611/week @ 2024-08-10 570/week @ 2024-08-17

2,479 每月下载量
34 个crate中(直接使用4个) 使用

MIT 许可证

89KB
2K SLoC

libgssapi

A safe MIT licensed binding to gssapi

更多信息请参见 rfc2744

gssapi是一个庞大而复杂的旧系统(就像 Computer Chronicles 一样古老)。因此,虽然这个库可能适用于许多机制,但它(到目前为止)只测试了与MIT和Apple实现一起使用的Kerberos 5。

要查看Kerberos 5的简单跨平台接口,请参见 cross-krb5

客户端和服务器之间的KRB5互认证示例

use libgssapi::{
    name::Name,
    credential::{Cred, CredUsage},
    error::Error,
    context::{CtxFlags, ClientCtx, ServerCtx, SecurityContext},
    util::Buf,
    oid::{OidSet, GSS_NT_HOSTBASED_SERVICE, GSS_MECH_KRB5},
};

fn setup_server_ctx(
    service_name: &[u8],
    desired_mechs: &OidSet
) -> Result<(ServerCtx, Name), Error> {
    let name = Name::new(service_name, Some(&GSS_NT_HOSTBASED_SERVICE))?;
    let cname = name.canonicalize(Some(&GSS_MECH_KRB5))?;
    let server_cred = Cred::acquire(
        Some(&cname), None, CredUsage::Accept, Some(desired_mechs)
    )?;
    Ok((ServerCtx::new(&server_cred), cname))
}

fn run(service_name: &[u8]) -> Result<(), Error> {
    let desired_mechs = {
        let mut s = OidSet::new()?;
        s.add(&GSS_MECH_KRB5)?;
        s
    };
    let (server_ctx, cname) = setup_server_ctx(service_name, &desired_mechs)?;
    let client_cred = Cred::acquire(
        None, None, CredUsage::Initiate, Some(&desired_mechs)
    )?;
    let client_ctx = ClientCtx::new(
        &client_cred, service_name, CtxFlags::GSS_C_MUTUAL_FLAG, Some(&GSS_MECH_KRB5)
    ))
    let mut server_tok: Option<Buf> = None;
    loop {
        match client_ctx.step(server_tok.as_ref().map(|b| &**b))? {
            None => break,
            Some(client_tok) => match server_ctx.step(&*client_tok)? {
                None => break,
                Some(tok) => { server_tok = Some(tok); }
            }
        }
    }
    let secret_msg = client_ctx.wrap(true, b"super secret message")?;
    let decoded_msg = server_ctx.unwrap(&*secret_msg)?;
    Ok(())
}

依赖关系

~0.2–2.1MB
~42K SLoC