10个版本

0.3.1 2024年1月9日
0.3.0 2023年3月30日
0.2.4 2021年8月24日
0.2.3 2021年3月9日
0.1.2 2020年3月21日

#559 in 身份验证

Download history 652/week @ 2024-03-13 999/week @ 2024-03-20 815/week @ 2024-03-27 734/week @ 2024-04-03 798/week @ 2024-04-10 768/week @ 2024-04-17 838/week @ 2024-04-24 958/week @ 2024-05-01 1018/week @ 2024-05-08 925/week @ 2024-05-15 741/week @ 2024-05-22 521/week @ 2024-05-29 642/week @ 2024-06-05 1290/week @ 2024-06-12 594/week @ 2024-06-19 384/week @ 2024-06-26

2,997每月下载量
35个crate中使用(通过libgssapi

MIT许可证

8KB
102 代码行

libgssapi

一个安全的MIT许可gssapi绑定

更多信息请参阅rfc2744

gssapi是一个非常庞大且复杂的旧系统(就像计算机编年史一样古老)。所以虽然这个库可能适用于许多机制,但到目前为止,它只与Kerberos 5和MIT和Apple的实现进行了测试。

要获取一个更简单的跨平台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–1.8MB
~36K SLoC