如何为389 Directory Server添加ldapPublicKey schema及解决相关异常
问题描述
我在Oracle Linux 9上安装了389 Directory Server 2.0.0,正在从运行OpenLDAP 2.4的虚拟机迁移数据,已通过导出导入完成所有用户条目迁移。389DS默认没有ldapPublicKey schema,参照资料我在/etc/dirsrv/slapd-<myinstance>/schema/99user.ldif中添加了以下内容:
dn: cn=schema objectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'MANDATORY: Service that accepts LDAP public keys' MUST sshPublicKey X-ORIGIN 'user defined' ) dn: cn=schema attributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'user defined' )
但使用Apache Directory Studio管理实例时出现以下问题:
- 导入的用户条目中
sshPublicKey属性显示为文本而非二进制数据 - 添加新属性时找不到
sshPublicKey选项 - 从头新建条目时,
ldapPublicKey未作为结构类显示
我还尝试过将99user.ldif中的ldapPublicKey类从AUXILIARY改为MANDATORY,但问题仍未解决。
解决步骤
1. 修正Schema定义格式
389DS要求同一个cn=schema条目下的属性定义合并在一个条目内,不能拆分。同时MANDATORY不是objectClass的合法关键字,AUXILIARY才是辅助类的正确类型。修改后的99user.ldif如下:
dn: cn=schema attributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 X-ORIGIN 'user defined' ) objectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY DESC 'Service that accepts LDAP public keys' MUST sshPublicKey X-ORIGIN 'user defined' )
2. 重新加载Schema并重启服务
修改完成后,重启389DS实例使schema生效:
dsctl <myinstance> restart
也可以尝试动态加载schema(无需重启):
dsconf <myinstance> schema reload
3. 刷新Apache Directory Studio的Schema缓存
Studio会本地缓存schema信息,需手动刷新:
- 断开当前LDAP连接
- 打开连接属性窗口,切换到「Schema」选项卡,点击「Reload Schema」
- 重新连接实例
4. 修复已导入条目的sshPublicKey属性
由于导入时schema未生效,属性被识别为文本,可通过两种方式修正:
- 单个条目:在Studio中编辑条目,删除现有
sshPublicKey,重新添加时选择「Binary」类型,粘贴公钥内容 - 批量修正:生成LDIF修改文件,用
ldapmodify执行(公钥内容需base64编码,可通过echo -n "ssh-rsa AAAAB3NzaC1yc2E..." | base64生成):
dn: uid=user1,ou=users,dc=example,dc=com changetype: modify replace: sshPublicKey sshPublicKey:: <base64编码的公钥内容>
5. 正确使用ldapPublicKey辅助类
ldapPublicKey是辅助类,不会出现在结构类选择列表中,正确操作流程:
- 新建条目时先选择基础结构类(如
inetOrgPerson) - 编辑条目,切换到「Object Classes」选项卡,点击「Add」搜索并添加
ldapPublicKey - 系统会自动要求添加
sshPublicKey属性
内容的提问来源于stack exchange,提问作者Hussain Akbar
相关产品推荐
相关产品推荐

